网上很多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
五、 上传镜像到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 容器交互
使用bridge模式自定义network
七、 maven中配置docker 使用dockerfile自动生成项目image。
spotify插件配置
https://github.com/spotify/docker-maven-plugin
八、 使用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
十、 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 ld
version: '2.1' #docker-compose version
services:
########################### 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 = utf8
collation-server = utf8_unicode_ci
skip-character-set-client-handshake
http://www.runoob.com/docker/docker-install-mysql.html http://www.cnblogs.com/baolong/p/5763412.html https://docs.docker.com/engine/reference/builder/#add https://docs.docker.com/samples/mysql/#where-to-store-data https://segmentfault.com/q/1010000003840346 https://yeasy.gitbooks.io/docker_practice/content/compose/compose_file.html
附上mysql权限准备sql
--mysql docker exec
use 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 mysql
docker 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命令)