Docker 可以理解为一个轻量级虚拟机,你可以在一台物理机上,装 N 个系统,每个系统部署不同的服务。

Docker 有几个非常重要的概念:镜像、仓库、容器。

镜像:可以理解为操作系统的系统盘,用于给容器安装系统用的,你也可以基于别人的镜像创建自己的镜像。

仓库:用于存储镜像的仓库

容器:相当于虚拟出来的一台台主机,他有存储、网络、系统等关键要素。你可以在容器里部署任何你想要部署的服务。

镜像操作

你可以创建 ( docker build )、删除 ( docker rmi )、下载 ( docker pull ) 镜像

设置镜像源

Docker 官方镜像仓库,在国内下载比较慢,可以通过国内的镜像源来加速镜像下载。本文介绍 Windows 通过 Docker Desktop 换源,如果你是其他系统,可以自行搜索。

复制下面信息到 Docker Desktop 设置

"registry-mirrors": [
    "https://hub-mirror.c.163.com",
    "https://mirror.baidubce.com"
]

创建镜像 ( docker build )

前提是要有构建镜像所需的 Dockerfile,关于 Dockerfile 后面会有专门的文章进行讲解。

docker build -t image_name .

下载镜像 ( docker pull )

这里就会通过仓库下载镜像到本机。

docker pull ubuntu

删除镜像 ( docker rmi )

docker rmi image_name

容器操作

容器操作分为:启动( docker run ),停止 ( docker stop ),删除 ( docker del ),执行 ( exec )、查看日志(docker logs)。

容器启动 ( docker run )

我们在启动时可以做很多的操作,比如我们可以进行目录映射端口映射设置环境变量等操作。

简单的容器启动

docker run ubuntu:18.04 /bin/echo 'Hello world'

启动 bash 终端,进行用户交互 ( -it )

docker run -it ubuntu:18.04 /bin/bash

后台运行容器 ( -d )

docker run -d ubuntu:18.04 script.sh

目录映射 ( -v )

# 简单映射
docker run -v /local_merchant/path:/container/path ubuntu:18.04 script.sh
# 使用变量,把当前目录映射到容器中
docker run -v $(PWD):/container/path ubuntu:18.04 script.sh

端口映射 ( -p )

docker run -p 9000:9000 ubuntu:18.04 script.sh

设置环境变量 ( -e )

docker run -e USER_NAME=zhangsan -p 9000:9000 ubuntu:18.04 script.sh
# 多个变量设置
docker run -e USER_NAME=zhangsan -e AGE=18 -p 9000:9000 ubuntu:18.04 script.sh

指定网络 ( –network )

如果你需要多个容器可以互相连接,可以通过指定网络把容器指定在同一个网络下。

# 创建网络
docker network create -d bridge my_net
# 容器加入网络
docker run --network my_net ubuntu:18.04 script.sh

指定容器名称

docker run --name my_container ubuntu:18.04 script.sh

停止容器 ( docker stop )

docker stop container_name

执行( docker exec )

此操作最常用的就是进入容器

docker exec -it container_name bash

删除容器 ( docker rm )

docker rm container_name

查看容器日志 ( docker logs )

docker logs container_name
# 查看实时日志
docker logs -f container_name

One More Thing

刚开始接触容器的时候经常会考虑的一件事就是容器它应该是一个集成环境,还是分散的一个环境,比如 LAMP 应该部署在一个容器里还是多个容器。

答案是应该分开部署,也就是 MYSQL Apache/Nginx PHP 应该部署在各自的容器中,这是因为容器本身只能监听一个进程,如果你父进程是 PHP,那么其他服务是不受 Docker 监听的,如果某个服务崩溃了,而这个进程恰好不是 PHP,就会导致 Dcoker 认为容器时正常的,但实际上服务已经不可用了。

如果分开部署的话就会有个问题,这么多容易应该如何管理。Docker 官方给出了工具 Docker Compose 对同一个项目,多个容器进行管理。

总结

本文仅介绍了容器是什么,以及容器的一些常用操作。容器的功能远不止于此,如果你想更深入了解容器的用法,可以通过搜索引擎进行更细致的了解。

当然容器服务化有利有弊,需要根据自身业务进行衡量,是否要进行容器化。