网上很多docker介绍都是基于unix系统下,win7的资料较少,出现的错误,搜索的结果都是路唇不对马嘴,Holy Shitte!。所以记录下过程,使需要的人少走弯路,确实可以节省很多时间。一、下载
网上很多docker介绍都是基于unix系统下,win7的资料较少,出现的错误,搜索的结果都是路唇不对马嘴,Holy Shitte!。所以记录下过程,使需要的人少走弯路,确实可以节省很多时间。
一、下载安装Docker
官网的说明是windows下必须是win10系统,而且下载缓慢,直接通过以下链接下载DockerToolBox最新版本,十秒搞定。
https://get.daocloud.io/toolbox/
下载完安装,选择安装目录,完成后会生成以下快捷方式。
我们主要使用第一个快速启动终端,第二个是用来查看docker实例以及下载官方镜像的。
点击启动,等一会如果。
如果出现** Cannot connect to the Docker daemon. Is the docker daemon running on this host?**
更新安装目录和本地缓存目录(C:/Users/admin.docker/machine/cache/)下boot2docker镜像文件(.iso)。boot2docker最新镜像地址 https://github.com/boot2docker/boot2docker/releases速度看运气。下载完替换安装目录和本地缓存目录两个地方的iso文件。
此外要想运行成功,还必须开启BIOS(F10还是F4忘记了)中的虚拟化 (visualization security)为enabled状态。
如果一切正常,启动成功,会出现以下界面。
检查是否运行的标志是 通过命令 docker version ,出现下面的结果,而且必须同时出现Server和Client信息(如果不使用快捷方式启动,可能只看到Server启动成功).
二、安装镜像
docker images是查看容器已经安装的镜像。
运行成功docker后,需要安装项目镜像,依赖jdk镜像,数据库镜像等。所谓镜像,就是你需要运行的项目及环境都要打包到docker中才可以运行成功。
其中通用的jdk库、mysql通过daocloud很方便的下载下来。
使用以下命令
docker pull daocloud.io/ld00000/jdk-8
再使用docker images会发现images多出了刚下载的镜像。
项目打包成镜像需要运行Run as---maven中输入package命令,target文件下生成生成jar文件。
注意:默认的docker运行环境目录是C:/Users/Xerxes/AppData/Roaming/Microsoft/Windows/Start Menu/Programs/Docker 必须使用shell命令进入到你打包的jar文件所在目录运行打包命令,或者把jar拷贝到以上目录中运行打包命令。
然后输入命令,别忘了最后的.
docker build -t 你的项目jar文件名(不包含后缀.jar) .
运行docker中spring boot项目镜像
**docker run -p 48080:80 -t treasure-0.0.1 **
提示mysql连接不上。
三、安装mysql
运行mysql容器(/my/datadir即/my/datadir . 指在当前目录下创建的存放数据的文件夹)
docker run --name mysql --volume-driver=local -v /my/datadir/treasure:/var/lib/mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root -d mysql
打开Kitematic
此处尽管共享了本地数据库的数据 /my/datadir/treasure(mysql下data中指定库的文件拷贝到当前命令行运行目录下,也可以用其他地址,如D:/xx/yy/zz),在上面的VOLUME下面的存放mysql数据的容器文件夹上点击enable,数据才会真的共享
不导入已有数据的话,运行mysql容器docker run --name mysql -e MYSQL_ROOT_PASSWORD=root -d mysql
$ docker exec mysql5 sh -c 'exec source --all-databases -uroot -p"$MYSQL_ROOT_PASSWORD"' > f:/schema.sql进入mysql容器
docker exec -it mysql-master bash
四、 容器增加volume
volume
五、 上传镜像到Docker Hub
注册https://hub.docker.com账号,新建一个public/private repository.
docker tag image {docker-hub-username}/{default-repo-folder-name}:first-image
docker push {docker-hub-username}/{default-repo-folder-name}:first-image
六、 docker 容器交互
https://docs.docker.com/engine/userguide/networking/work-with-networks/#basic-container-networking-example
使用bridge模式自定义network
七、 maven中配置docker 使用dockerfile自动生成项目image。
spotify插件配置
https://github.com/spotify/docker-maven-plugin
https://eacdy.gitbooks.io/spring-cloud-book/content/3%20%E4%BD%BF%E7%94%A8Docker%E6%9E%84%E5%BB%BA%E5%BE%AE%E6%9C%8D%E5%8A%A1/3.7%20%E4%BD%BF%E7%94%A8Maven%E6%8F%92%E4%BB%B6%E6%9E%84%E5%BB%BADocker%E9%95%9C%E5%83%8F.html
八、 使用compose 一次配置web应用所有images
使用docker-compose插件可以编排多个容器实例,只需要配置docker-compose.yml文件即可。如果使用数据库服务名是mysql,那么在项目中数据库URL中host直接改为mysql,这样来连接容器内数据库实例。具体看后面的demo。
其他:
kitmatic可以启动、停止、删除容器
docker自带终端不能直接粘贴地址,MINGW64点击左上角图标,粘贴
查看容器ip:docker inspect --format '{{ .NetworkSettings.IPAddress }}' angry_golick
**如果项目build镜像用到的dockfile有expose 80 然后docker run -p 48080:80 -t treasure-0.0.1运行项目
会导致项目访问不了 必须去掉dockfile中expose 80 然后使用http://192.168.99.100:8080/swagger-ui.html即可。**
删除空白image
docker rmi $(docker images | grep "^<none>" | awk "{print $3}")
dockerhub 84795210
九、 终极Guide
9个docker菜单项目容器与mysql容器互通
十、 docker-compose 配置network
十一、ubuntu 项目部署实例
首先做volumes ,sql文件初始化 ,dockerfile准备等环境配置 (在ubuntu对应目录做好volume映射(容器中文件路径与宿主机文件路径一一对应,此步骤也可以在jenkins shell command中编写脚本实现))
最终docker-compose.yml参考
# Docker compose yml# Author: Cruz# site: https://github.com/gp15237125756# notion: # 1. /var/lib/mysql or /var/lib/redis locate the default data paths inside the container which created while redis&mysql container starting# also /usr/bin/mysql represents the default path which created by mysql image# 2. build: . point to the dockfile path for web application# 3. volumes .:/code correspond to HOST:CONTAINER# 4. create the essential directory in local computer before startup docker-compose to do some initiation # 5. create network: docker network create ldversion: '2.1' #docker-compose versionservices:########################### APPLICATION ################################## web: container_name: webapp build: context: ./app/dockfile dockerfile: Dockerfile ports: - "80:8088" volumes: - ./app/code:/app/code links: - redis - mysql networks: - ld depends_on: mysql: condition: service_healthy #database health check before application startup #redis:########################### REDIS ################################## redis: container_name: redis image: daocloud.io/library/redis volumes: - ./redis/data:/var/lib/redis networks: - ld########################### MYSQL ################################## mysql: container_name: mysql #build: ./mysql image: daocloud.io/mysql:5.6 ports: - "3306:3306" volumes: - ./mysql/sql:/docker-entrypoint-initdb.d # execute init sql - ./mysql/cnf:/etc/mysql/conf.d - ./mysql/data:/var/lib/mysql # data location environment: MYSQL_ROOT_PASSWORD: root networks: - ld restart: always healthcheck: test: "/usr/bin/mysql --user=root --password=root --execute /"SHOW DATABASES;/"" # test: "/usr/local/mysql/bin/mysql --user=foo --password=foo --execute /"SHOW DATABASES;/"" interval: 30s timeout: 30s retries: 5#volumes:# ./mysql/data:/var/lib/mysql# ./redis-data:/var/lib/redis########################### NETWORKS ##################################networks: ld: external: name: ld
部署后mysql如果中文出现乱码,./mysql/cnf下必须增加一个自定义配置文件custom.cnf
[mysqld]character-set-server = utf8collation-server = utf8_unicode_ciskip-character-set-client-handshake
network配置
http://www.runoob.com/docker/docker-install-mysql.htmlhttp://www.cnblogs.com/baolong/p/5763412.htmlhttps://docs.docker.com/engine/reference/builder/#addhttps://docs.docker.com/samples/mysql/#where-to-store-datahttps://segmentfault.com/q/1010000003840346https://yeasy.gitbooks.io/docker_practice/content/compose/compose_file.html
附上mysql权限准备sql
--mysql docker execuse mysql;delete from user where user='root';flush privileges;drop database if exists `treasure`;create database `treasure`;user `treasure`;CREATE USER 'root' IDENTIFIED BY 'root';-- 将docker_mysql数据库的权限授权给创建的docker用户,密码为123456:grant all on treasure.* to root@'%' identified by 'root' with grant option;-- 刷新权限flush privileges;docker run --name mysql-master -e MYSQL_ROOT_PASSWORD=root -d mysqldocker run --name mysql-master -v /my/own/datadir:/mysql/data -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
以上是win7环境下docker配置,生产环境下应该使用linux系统,安装简单多了。
十二、Jenkins自动化发布
正常项目以docker方式发布,可以配置docker-registery建立本地容器镜像仓库,使用Jenkins自动化发布到该仓库,以镜像方式交付给测试或生产环境。
由于以上ubuntu实例,以docker-compose方式在测试环境中运行,所以发布流程分为:
- 从svn拉取项目源码到Jenkins的workspace。
2.打包上面的代码,生成jar mvn clean package -a
3.使用SSH方式,将jar拷贝到./app/code目录下
4.执行shell脚本 重启docker-compose
首先,安装Jenkins插件,如Maven Integration plugin,Publish Over SSH,Subversion Plug-in等,有的已安装好了。Global Tool Configuration配置jdk,maven安装路径
系统设置
新建任务
保存配置。选中Poll SCM 添写* * * * * 意思是 jenkins每隔一分钟去SVN版本库中看看有更新没,如果有更新,则触发构建。以上设置周期5分钟间隔检查svn,如有变化,才重新build。可打开控制台,查看或调试构建过程。
Jenkins构建后操作可以做一些优化,如删除之前的web容器和image,这样每次都会使用提交后代码编译,打包,构建容器实例。配置如下
即把传输文件和执行脚本分成2个transfer Set(如果放在一个transfer set默认先传输完文件,然后执行shell命令)