背景
- 作为一名程序员,每个人或多或少都干过运维的事,在不使用虚拟化技术时,同样的一个jar包或war包,会因服务器环境的不同而出现部署失败的问题(假设同一个jar包需要集群部署,在服务器A和服务器B分别部署一个实例,但有可能出现服务器A部署成功,服务器B部署失败的原因)这个时候,运维可能会将锅甩给开发,开发可能会甩给运维,导致撕逼。那么作为虚拟化技术的代表 --
docker可以完美的解决这样的冲突。
一、什么是docker?
- 这里不照本宣科,具体的解释网上有许多,可以自行百度。
二、docker有什么用?
- 根据以上的背景,docker可以解决运维和开发人员的矛盾冲突。除此之外,docker是一门虚拟化技术,是一个运行程序的程序。
三、一个case了解docker的基本运行顺序
- 在docker官网中, docker的图标是一个背上有许多集装箱的鲸鱼。那么什么叫集装箱呢?集装箱就是一些装东西的容器,
docker就是描述鲸鱼运输集装箱的过程。这句话与docker的一些操作非常相似。鲸鱼要运输集装箱,首先就要构建集装箱(创建Dockerfile文件),构建完了就需要将物品分离装箱,比如苹果装在一个箱子里,橘子装在一个箱子里(docker build镜像)。装箱后要将集装箱放置于固定的定点,等待鲸鱼拿箱子(docker push), 鲸鱼拿箱子放在背上(docker pull)开始运输(docker run).
四、Getting Started
- 学习任何技术都能按部就班。既然要Getting Started, 那么最快的方式当然是访问官网的Getting Started啦。官网的Getting Started页面如下:
官网映入眼前的就是一个button,上面写着下载并学习教程,我们点击进去发现有各种各样的docker(如下图),windows版本的、mac版本的、centos版本的等等
我比较倾向使用命令行的方式,且我本地的虚拟机装的是centos系统,所以最终选择下载Docker Engine - CentOS(Community)。点击进去,并将鼠标滑到网页的最下面(如下图),可发现,这不是我们最喜欢的官方文档教程么?
于是我们点击进去,得到了最有权威的docker教程文档: docs.docker.com/install/lin…
五、安装docker engine
- 上述url展示给我们的安装文档可以说非常详细了(但要注意: centos版本至少为centos 7及以上,因为需要linux 3.10及以上的内核才能支持docker, 可以使用 uname -r 查看内核版本),里面有卸载老版本等等、安装docker engine操作、添加docker yum操作、额外的可选操作等等等等。看到这样的文档,当然是不亦乐乎呀。于是使用
ctrl c + ctrl v大法分别执行了如下操作:
# 1. 卸载docker旧版本(centos 7直接使用yum install docker也能安装docker,但是不建议这么玩,可能会出现一些问题。最好是跟着官网来,)
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
# 2. 添加docker的一些依赖
sudo yum install -y yum-utils \
device-mapper-persistent-data \
lvm2
# 3. 添加docker yum源仓库
sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
# 4. 安装docker engine (这一步骤会从国外下载docker engine, 网速会比较慢)
sudo yum install -y docker-ce docker-ce-cli containerd.io
# 5. 启动docker 服务
systemctl start docker
# 6. 启动hello-world镜像
sudo docker run hello-world
- 上述6步执行完成后,应该会在终端中看到如下信息:

- 根据图上的提示可以得知,
docker run hello-world命令的执行过程:
1. 首先从本地去寻找hello-world:latest镜像, 后面的:latest表示的是此镜像的tag,若拉取或者run镜像的时候没有指定tag,则默认使用latest
2. 若本地找不到对应的镜像,则去docker仓库中心去找(docker hub), 类似于git hub。
3. 若docker hub中有对应的镜像则先pull下来再run
六、Docker常用命令
- Docker分为管理命令(Management Commands)和普通命令(Commands), 在终端输入
docker即可查看它常用的一些命令。其中Management Commands命令包含对镜像、容器等对象的操作,平常我们所使用的docker ps命令就是属于容器对象的操作,它的完整命令为: docker container ls
6.1 docker search命令
- 假设我们需要一个nginx镜像,那么我们需要从docker hub中去查找nginx镜像,如下图所示:
除了上述的方式外,还能使用docker search命令查看。eg: 输入 docker search nginx命令,如图:

6.2 docker run命令
- 假设我们要运行一个nginx镜像,依次执行如下命令:
# 1. 拉取nginx镜像
docker pull nginx
# 2. 启动nginx镜像
docker run nginx
按照上述的命令启动nginx镜像,发现一直阻塞到那里了。
经过一番查询后,发现要加-d参数来当成守护进程运行。
于是执行如下命令:
docker run -d nginx
执行完毕后,又发现,我访问无法连接到nginx首页:
经过一番研究后,发现要使用-p命令来做端口映射,于是一次执行如下代码:
# 强制停止运行的nginx容器(后面说明此命令)
docker rm -f 容器id
# 添加端口映射启动nginx镜像
docker run -it --name nginx -d -p 80:80 nginx:latest
# 访问nginx首页
curl localhost
按照如上的改造后的命令运行nginx镜像后,发现能访问nginx首页了

- 总结下docker run命令
docker run --name 容器名 -i -t -p 主机端口:容器端口:ro -d -v 主机目录:容器目录 镜像ID或镜像名:TAG
# --name 指定容器名,可自定义,不指定自动命名
# -i 以交互模式运行容器
# -t 分配一个伪终端,即命令行,通常-it组合来使用
# -p 指定映射端口,将主机端口映射到容器内的端口
# -d 后台运行容器
# -v 指定挂载主机目录到容器目录,默认为rw读写模式,ro表示只读, 使用此参数可以覆盖镜像中的某个文件夹,并添加关联。当我们启动一个mysql时,若我们直接启动mysql镜像,那么持久化存储的数据在容器中,那么这份数据将会随着容器的消失而消失。若我们将宿主机存放持久化数据的路径挂载到mysql镜像中对应的存储数据的路径。那么即使把容器删除,按照挂在路径重新启动镜像时,数据也不会丢掉。
6.3 docker container相关命令
- 当我们启动镜像后,会新建一个容器来运行镜像。我们可以使用如下命令来查看
正在运行的容器有哪些:
# 使用新版本docker支持的命令
docker container ls
# 使用旧版本执行的命令
docker ps

- 可以添加
-a参数来查看所有运行过的容器(包括运行中和结束的容器)
# 使用新版本docker支持的命令
docker container ls -a
# 使用旧版本的docker支持的命令
docker ps -a

- 总结下docker容器相关命令
docker conatiner ls -a -q
# docker ps查看正在运行的容器
# -a 查看所有容器(运行中、未运行)
# -q 只查看容器的ID
# 启动容器
docker start 容器ID或容器名
# 停止容器
docker stop 容器ID或容器名
# 删除容器, -f表示强制删除
docker rm -f 容器ID或容器名
6.4 docker exec命令
6.5 查看容器日志命令
docker logs 容器id或名称
6.6 宿主机与容器的文件交互
# 此命令一般是运行容器中临时需要的,比如我们需要给nginx容器中动态添加一个html文件,那么就可以使用此命令
# 宿主机文件拷贝到容器中
docker cp 宿主机文件路径 容器ID或容器名:容器路径
# 此命令一般要修改容器中的配置文件,eg: mysql 5.7版本的是不支持存储中文的,那么我们可以把容器中的配置文件copy到宿主机,在宿主机进行修改(将编码改成utf8),在启动容器的时候再使用-v参数将文件挂载过去,这样就能支持mysql 5.7版本的docker存储中文了
# 容器文件拷贝到主机中
docker cp 容器ID或容器名:容器路径 宿主机文件路径
七、小结
- docker是一项非常成熟的虚拟化技术,使用它,我们可以在一台电脑上装多个tomcat、多个nginx、多个centos等等。
- I am a slow walker, but I never walk backwards.