不知不觉使用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}:查看容器的差异