Docker 入门

2022 年了,才开始学习 Docker,也是没谁了。当然,不是闲着没事才去学习的,最初的目的是为了搭建一个博客系统。

安装

Windows 安装 Docker

下载地址:Docker Desktop for Mac and Windows

Mac 安装 Docker

下载地址:Docker Desktop - Docker

CentOS 8 安装 Docker

参考此处:CentOS8 安装 Docker-阿里云开发者社区

1. 卸载老版本

yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine

2. 安装docker 基础包

yum install -y yum-utils \
  device-mapper-persistent-data \
  lvm2

3. 设置稳定仓库

yum-config-manager \
    --add-repo \
    https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

4. 安装Docker Engine - Community

  • 安装最新版本(latest)
yum install docker-ce docker-ce-cli containerd.io
  • 安装指定版本
yum list docker-ce --showduplicates | sort -r  #查看版本
sudo yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io #安装指定版本

5. 启动与测试

sudo systemctl start docker  # 启动docker
docker run hello-world  #测试

运行后会显示下图,说明docker安装成功。

PS. 安装完 Docker 后,建议先不要使用其图形客户端,学会基础的命令之后,再来看客户端提供的功能,你会发现客户端只剩下好看了。

常用命令

镜像 image

# 列出本机的所有 image 文件。
docker image ls

# 删除 image 文件
docker image rm [imageName]

# 从仓库中拉取 image,不带 tag,便默认 latest
docker image pull [imageName]:[tag]

# 创建 image,基于 Dockerfile 文件
# -t 指定 image 文件名称,可指定标签,最后指定 Dockerfile 的路径,--no-cache 清空缓存,不清空会出现 <none> 的 image
docker image build -t xxx .
docker image build -t xxx:0.0.1 .
docker image build --no-cache -t xxx:0.0.1 .
# 带用户名信息,为了发布到仓库
docker image build -t [username]/[imageName]:[tag] .

# 登录仓库,在命令行发布
docker login
# 本地 image 标注用户信息
docker image tag [imageName] [username]/[imageName]:[tag]
# 发布 image 到仓库
docker image push [username]/[imageName]:[tag]

注意:发布镜像需要在 hub.docker.com 上注册账号,另外,尽量使用别人制作的 image 文件,多从官方仓库看看。

容器 container

# 列出本机正在运行的容器
docker container ls
# 列出本机所有容器,包括终止运行的容器
docker container ls --all

# 删除容器文件
docker container rm [containerID]

# 从 image 生成一个运行的实例
docker container run hello-world
# 自定义容器的名称,--name 参数指定容器名称
docker container run --name helloworld hello-world
# 后台运行,不占用终端
docker container run -d hello-world

# 命令行体验 Ubuntu 系统,运行服务,-it 映射 Shell
docker container run -it ubuntu bash
# 映射本地端口,-p 本地 8000 映射容器 3000 端口
docker container run -p 8000:3000 -it koa-demo /bin/bash
# 端口随机映射 -P(大写p)
docker container run -P -it koa-demo /bin/bash
# 容器终止运行后,自动删除容器文件
docker container run --rm -p 8000:3000 -it koa-demo /bin/bash

# 终止运行容器文件,stop 软终止,kill 强制终止
docker container stop [containID]
docker container kill [containID]

# 启动容器,不会新建容器文件
docker container start [containID]

# 终端日志,Shell 的输出
docker container logs

# 进入正在运行的容器
docker container exec -it [containerID] /bin/bash

# 拷贝容器的文件到本地
docker container cp [containID]:[/path/to/file] .

注意:容器停止,并不代表容器文件删除,想要停止便自动删除文件,运行时需要加参数 --rm

入门使用

从制作一个镜像开始,到在容器中运行一个本地的静态站点,大致走一遍整体的使用流程。

制作镜像

制作镜像需要一个叫 Dockerfile 的配置文件,一个纯文本文件,用来生成 image,Docker 根据该文件生成二进制的 image 文件。

找一个目录,创建 Dockerfile 文件,里面编写如下几行代码:

FROM nginx
RUN echo "Hello Nginx with Docker" > /usr/share/nginx/html/index.html

这是一个非常简单的示例,就两行代码:

  • FROM nginx 表示该 image 将继承自官方 nginx 镜像,没有指定版本,那么就是默认继承最新 latest 版本
  • RUN 命令表示,在创建 image 之前,执行的命令,也就是说,这个创建好的镜像将会有一个 index.html 的文件

定义好之后,开始创建镜像,在 Dockerfile 目录下执行如下命令:

docker image build -t nginx-demo:0.1 .

一个名称叫 nginx-demo 的 image 就创建成功了,然后就可以基于这个 image 启动一个容器。

启动容器

启动容器的命令如下:

docker run -p 8080:80 --name nginx-demo nginx-demo:0.1

以上命令省略了 container 这个词,其实意思是一样的。

如上命令行显示,表示启动成功了,在浏览器中访问:http://localhost:8080 即可在网页上看到 「Hello Nginx with Docker」这句话。

映射本地目录

上面例子是在创建 image 的时候,写入了一个 index.html 文件,启动容器之后,就可以访问到了。

如果本地有一个静态站点,如何让它在 Docker 的容器中跑起来呢?其实,很简单,把本地的静态站点目录映射到容器中就可以了。

重新启动一个容器,命令如下:

docker run --rm -p 8080:80 -v $(pwd):/usr/share/nginx/html nginx-demo:0.1

上面多了个 -v 的命令,也可以写成 --volume,它的作用是映射目录,将本地目录映射到容器中,后面跟着的参数便是对应的目录,用 : 相隔。

  • $(pwd) 表示的是本地的目录,这里我们放一个静态站点,或者放一个 html 文件也可以;
  • /usr/share/nginx/html 即为 Nginx 容器默认的站点目录,具体可以进入容器内部,从 nginx 的配置文件中查看到。

那么,如何能够进入容器内部看看呢?

映射命令行

启动一个容器,使用如下命令:

docker run --rm -it nginx-demo:0.1 /bin/bash
  • it 的作用是映射 Shell,这样就可以在本地运行容器的命令了

通过如下一系列命令,就可以查看到 Nginx 的配置文件。

cd /etc/nginx/conf.d
cat default.conf

在这个命令行下,我们还能够查看到这个 nginx 镜像是基于哪个 Linux 系统制作的。运行这个命令试试:cat /etc/issue

发布镜像

发布这个环节就省了,这个程度的镜像根本就不能称之为自制的镜像。这个示例只是为了熟悉一下命令而已。

通过这个示例也大概了解了一个容器的生成和基本的使用,如果想要深入了解如何制作一个镜像,除了要熟悉 Dockerfile 的一些基本语法,还要对 Linux 命令行有一定的了解。