Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。


# 一、Docker的用途

Docker 的主要用途,目前有三大类。

  1. 提供一次性的环境。比如,本地测试他人的软件、持续集成的时候提供单元测试和构建的环境。

  2. 提供弹性的云服务。因为 Docker 容器可以随开随关,很适合动态扩容和缩容。

  3. 组建微服务架构。通过多个容器,一台机器可以跑多个服务,因此在本机就可以模拟出微服务架构。


# 二、验证是否安装成功

docker version

# 三、Image文件

Docker 把应用程序及其依赖,打包在 image 文件里面。只有通过这个文件,才能生成 Docker 容器。
image 文件可以看作是容器的模板,Docker 根据 image 文件生成容器的实例。
同一个 image 文件,可以生成多个同时运行的容器实例。

image 是一个 二进制文件。实际开发中,一个 image 文件往往通过继承另一个 image 文件,加上一些个性化设置而生成。
举例来说,你可以在 Ubuntu 的 image 基础上,往里面加入 Apache 服务器,形成你自己的 image。

# 列出本机的所有 image 文件

$ docker image ls

# 删除 image 文件

$ docker image rm [imageName]

image 文件是通用的,一台机器的 image 文件拷贝到另一台机器,照样可以使用。

一般来说,为了节省时间,我们应该尽量使用别人制作好的 image 文件,而不是自己制作。
即使要定制,也应该基于别人的 image 文件进行加工,而不是从零开始制作。

# 镜像仓库(Image Repository)

为了方便共享,image 文件制作完成后,可以上传到网上的仓库。

  • Docker 的官方仓库 Docker Hub 是最重要、最常用的 image 仓库。
  • 此外,你也可以使用国内的镜像仓库(如阿里云、腾讯云)或者搭建私有仓库。
  • 出售自己制作的 image 文件也是可以的。

# image&&container

容器是镜像跑起来的实例,一个镜像可以有多个容器


# 四、如何跑起来呢

docker image pull <project>       #将image文件从仓库抓取到本地
docker container run <project>    #将image文件在你的电脑上跑起来,新建容器
docker container start [ID]       #将已有的容器跑起来
docker container kill [ID]        #手动终止容器的运行
docker container ls               #在你电脑上正在跑起来的容器
docker container ls -all          #列出本机所有容器,包括终止运行的容器
docker container rm [containerID] #删除停止运行的容器,防止占用硬盘空间
docker exec -it my-nginx bash     #在叫my-nginx的容器内,开启一个bash命令终端进去操作

# 注意,docker container run命令具有自动抓取 image 文件的功能。如果发现本地没有指定的 image 文件,就会从仓库自动抓取。因此,前面的docker image pull命令并不是必需的步骤。

# 五、常见参数

参数 全称 作用 示例 说明
-d --detach 后台运行容器 docker run -d nginx 容器启动后,终端不会附加到容器的输入/输出,返回一个容器ID。这是运行后台服务(如Web服务器、数据库)的标准模式。
-p --publish 映射容器端口到主机端口 docker run -p 8080:80 nginx 格式为 -p <主机端口>:<容器端口>。将容器内部的端口暴露给主机,从而可以从外部访问容器内的服务。示例中将容器的80端口映射到主机的8080端口,通过 http://localhost:8080 即可访问Nginx。
-v --volume 挂载数据卷 docker run -v /host/data:/container/data app 格式为 -v <主机路径>:<容器路径>。用于在主机和容器之间共享数据或持久化容器内的数据。即使容器被删除,主机上的数据仍然存在。
-e --env 设置环境变量 docker run -e MY_VAR=value -e DB_HOST=db app 向容器内部传递配置信息,如数据库连接字符串、密码、运行模式等。应用程序在容器内可以通过读取这些环境变量来改变其行为。
--name --name 为容器指定一个名称 docker run --name my_nginx nginx 为创建的容器赋予一个易读的唯一名称,方便后续的管理(如启动、停止、查看日志),而不必使用冗长且难记的容器ID。

一个典型的 docker run 命令会组合使用这些参数来定义一个功能完整的容器:

# 运行一个名为 'my-web-app' 的 WordPress 容器
docker run -d \                    # 在后台运行
  --name my-web-app \              # 容器命名为 my-web-app
  -p 8080:80 \                     # 将主机的8080端口映射到容器的80端口
  -e WORDPRESS_DB_HOST=db:3306 \   # 设置环境变量:数据库地址
  -e WORDPRESS_DB_USER=root \      # 设置环境变量:数据库用户
  -e WORDPRESS_DB_PASSWORD=secret \# 设置环境变量:数据库密码
  -v wordpress_data:/var/www/html \# 挂载命名卷,持久化网站数据
  wordpress:latest                 # 使用的镜像

# 其他常用参数补充

参数 全称 作用 示例
-it --interactive + --tty 以交互模式运行容器 docker run -it ubuntu /bin/bash
--rm --rm 容器退出时自动清理 docker run --rm alpine echo "hello"
-u --user 指定运行容器的用户 docker run -u 1000 myapp
--network --network 将容器连接到指定网络 docker run --network my_net nginx