
不知不觉使用Docker也有那么几年了,从当时公司的阡陌虚拟机安装Docker,到后来自己Mac电脑安装Docker,到后来公司的PC、家里的PC都装了Docker,最后连家里的群晖也没放过装了Docker。其好处不言而喻,做好一次镜像,所有环境都能保持一致,调试东西、运行一点服务无比方便。
一、安装Docker
直接到Docker官网下载最新版本的Docker Desktop,下载之前会让你注册帐号并登录,同时会有一个简单的引导页。

1.1 Mac版本
下载地址:https://download.docker.com/mac/stable/Docker.dmg
1.2 Windows版本
下载地址:https://download.docker.com/win/stable/Docker%20for%20Windows%20Installer.exe
1.3 群晖版本
进入群晖控制面板 > 打开套件中心 > 搜索“Docker” -> 安装,即可完成安装,具体的使用后续再单独开一个主题。

二、拉取镜像
Docker Hub中有不少的镜像可以直接使用,当然如果有兴趣也可以搭建私有仓库,以下以CentOS为例:
#Docker Hub中的CentOS镜像可以在此处找到https://hub.docker.com/_/centos
#拉取(默认版本是latest)
docker pull centos
#拉取指定大版本(指定大版本中的最新小版本)
docker pull centos:7
#拉取指定小版本
docker pull centos:7.6.1810
#以下是我常用的镜像
docker pull redis:3.2
docker pull gogs/gogs
docker pull mysql:5.7
docker pull sonatype/nexus3
docker pull jenkins/jenkins:2.187
docker pull memcached:1.5
#以下是我基于CentOS 7制作的集成了Tengine、php、yaf的镜像
docker pull e2ghost/webserver
三、制作镜像
有点懒,直接把官方的Get Start搬过来,或是自己编写Dockerfile构建……
git clone https://github.com/docker/doodle.git
cd doodle/cheers2019 &&
docker build -t e2ghost/cheers2019 .
docker run -it --rm e2ghost/cheers2019
docker login &&
docker push e2ghost/cheers2019
除了直接构建之外,你还可以基于现有的镜像(如基于CentOS),安装所需要的软件、个性化之后提交成新的个人仓库镜像。
四、提交镜像
#如果在原有镜像上进行修改,则可以对比差异
docker diff 354d80d996bb
#将修改后的容器重新打包成镜像
docker commit 8b57cee44310 e2ghost/webserver
#将容器354d80d996bb 保存为新的镜像,并添加提交人信息和说明信息。
docker commit -a "e2ghost" -m "update yaf configuration" 354d80d996bb e2ghost/webserver
#推送新版本到仓库中
docker push e2ghost/webserver
#给新的版本打标签
docker tag 354d80d996bb e2ghost/webserver:2.0
#推送指定版本的镜像到仓库中
docker push e2ghost/webserver:2.0
五、更新镜像版本
拉取新版本后,重新运行即可(视频情况而定是否需要删除旧的容器)
六、导出镜像
docker export cbe3cb7799ed > DockerImage.tar
七、导入镜像
docker import - update < DockerImage.tar
八、Docker的运行
Windows中,如果需要进行目录映射,需要打开Docker的设置界面配置可访问的磁盘,在Mac中无此烦恼,以下以Mac版本进行演示:
#运行MySQL 5.7,并且将本地的 /Users/Ethan/DockerFiles/mysql_data 目录映射到容器中的 /var/lib/mysql 目录,这样一来,数据库的数据实际保存位置在Mac电脑中的/Users/Ethan/DockerFiles/mysql_data 目录中
#其次,将宿主机的7306端口映射到容器内的3306端口
#此处的--name跟着的名称,可以在配置了容器互访后作为hostname使用
docker run -d -p 7306:3306 --name mysql.mbp -P -e mysqld -e MYSQL_ROOT_PASSWORD={这个MySQL实例的root用户密码} -e MYSQL_USER=work -e MYSQL_PASSWORD={这个MySQL实例的work用户密码} -e MYSQL_DATABASE=testDb -v /Users/ethan/DockerFiles/mysql_data:/var/lib/mysql mysql:5.7
#运行redis
docker run -p 7379:6379 --name redis.mbp -d redis:3.2
#运行memcached
docker run -p 11211:11211 --name memcache.mbp -d memcached:1.5
#运行Jenkins 2.187
docker run -d -p 9200:8080 -p 50000:50000 --name jenkins.mbp --privileged=true -v /Users/ethan/DockerFiles/jenkins_home:/var/jenkins_home jenkins/jenkins:2.187
#运行gogs(又轻又快的超级好用的git仓库管理工具,基于Go语言开发)
docker run --name=gogs.mbp -p 9322:22 -p 9300:3000 -v /Users/ethan/DockerFiles/gogs:/data gogs/gogs
#运行nexus(好用的Maven仓库管理工具)
docker run -d -p 8081:8081 --name nexus.mbp -v /Users/ethan/DockerFiles/nexus3:/nexus-data --restart=always sonatype/nexus3
九、Docker容器互访(容器之间直连)
如果想从A容器访问B容器,除了用宿主机的IP进行连接外,在本地容器之间有更为简便的访问方便,当配置好网络并把需要互访的容器加入相同网络之后,那么容器之间便可以透过容器名称的方式来连接。如有一个MySQL的容器名称是mysql5,暴露了7306端口,那么webserver容器配置数据库IP时,便可以将host设置为mysql5,端口用内部端口3306即可,不需要使用暴露在宿主机的端口7306。详细操作步骤记录如下:
创建网络mynet
docker network create -d bridge --subnet 172.25.0.0/16 mynet
连接容器到网络mynet
docker network connect mynet 40cac88e87cd
docker network connect mynet 9c88ae62125d
docker network connect mynet 5267b3503d9c
docker network connect mynet e71963112392
#以上是容器ID
查看网络配置mynet
docker network inspect mynet
断开容器的网络
docker network disconnet mynet 容器ID
移除网络
docker network rm mynet
十、Docker常用指令
交互模式中,使用ctrl+p+q退出交互并保持运行状态。
- docker ps:查看正在运行的容器
- docker ps -a:查看所有容器
- docker start {containerID}:启动容器
- docker stop {containerID}:停止容器
- docker rm {containerID}:删除容器
- docker images:查看镜像列表
- docker rmi {imageID}:删除镜像
- docker pull [images]:[version]:从DockerHub拉取指定镜像
- docker exec -it {containerID} /bin/bash:进入容器终端
- docker log {containerID}:查看容器日志
- docker diff {containerID}:查看容器的差异