Docker

gitbook: 前言 - Docker — 从入门到实践 (gitbook.io)

官方文档: docker | Docker Documentation

安装 Docker

ubuntu 20.04

1
2
3
4
5
6
7
8
9
10
11
12
13
# Add Docker's official GPG key:
sudo apt-get update
sudo apt-get install ca-certificates curl gnupg
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg

# Add the repository to Apt sources:
echo \
"deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
"$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
1
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

启动 Docker

由于Docker是 B/S 架构,所以需要在本机也启动 Docker 服务

1
2
sudo systemctl enable docker
sudo systemctl start docker

建立docker用户组

将用户组的人加入 docker 用户组,这样就不用一直使用sudo等命令

1
2
sudo groupadd docker
sudo usermod -aG docker $USER

这样可以允许该用户组的成员使用docker

如果尝试之后没有可以试试重启服务器

制作镜像

可以使用 docker commit 创建镜像,这种方法就是将对容器的修改保存进镜像中,这种方法不推荐使用,因为难以维护

制作镜像推荐使用 Dockerfile 制作镜像

创建 Dockerfile

VOLUMES

数据卷,用来持久化容器中的数据,以免容器销毁后数据也销毁,同时保证数据不在镜像中,防止以后转移镜像时,带上敏感数据

COPY 与 ADD

简单来说两者都可以将文件复制到容器中,但是 ADD 有着更高级的功能,比如自动解压等

EXPOSE

暴露端口使用

WORKDIR

在 Dockerfile 中,修改工作路径并不是通过 cd /app 来实现的,而是通过 WORKDIR /app 修改工作路径,这是新手常犯的错误 :(

RUN

这个是最基础的指令了,就是执行之后的 shell 命令,但是为了将构建的镜像层数减小,最好是将

1
2
3
4
RUN apt-get install -y git certbot python3-certbot-nginx expect openssh-server 
RUN mkdir /var/repo/
RUN chmod -R 755 /var/repo/
RUN git init --bare /var/repo/resinceBlog.git

改成

1
2
3
4
RUN apt-get install -y git certbot python3-certbot-nginx expect openssh-server \
&& mkdir /var/repo/ \
&& chmod -R 755 /var/repo/ \
&& git init --bare /var/repo/resinceBlog.git \

这样仅仅执行了一遍 RUN 命令,减少了镜像层数

进入容器内部

1
docker exec -it "[your_container_name]" /bin/bash

获取镜像

1
docker pull [OPTION] 仓库名[:标签]

一般会从官方镜像中获取需要的镜像

列出镜像

1
docker image ls

删除本地镜像

1
docker image rm [opetion] <image>

启动容器

下面的命令则启动一个 bash 终端,允许用户进行交互。

1
2
3
$ docker run -t -i ubuntu:18.04 /bin/bash

root@af8bae53bdd3:/#

其中,-t 选项让Docker分配一个伪终端(pseudo-tty)并绑定到容器的标准输入上, -i 则让容器的标准输入保持打开,加上 -d 以守护态运行

在交互模式下,用户可以通过所创建的终端来输入命令,例如

1
2
root@af8bae53bdd3:/# ls
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var

当利用 docker run 来创建容器时,Docker 在后台运行的标准操作包括:

  • 检查本地是否存在指定的镜像,不存在就从 registry 下载

  • 利用镜像创建并启动一个容器

  • 分配一个文件系统,并在只读的镜像层外面挂载一层可读写层

  • 从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去

  • 从地址池配置一个 ip 地址给容器

  • 执行用户指定的应用程序

  • 执行完毕后容器被终止

终止容器

1
docker container stop

进入容器

1
docker exec -it [docker_name] /bin/bash

推送与拉取

拉取

1
docker pull centos # 拉取

推送

1
2
3
docker tag ubuntu:18.04 username/ubuntu:18.04
docker push username/ubuntu:18.04
docker search username

Docker-compose

是对 Docker 容器集群的集体编排

安装

Install the Compose plugin | Docker Docs

ubuntu

1
2
sudo apt-get update
sudo apt-get install docker-compose-plugin

基本概念

镜像

存储静态数据,是一个特殊的文件系统,使用分层存储

容器

可以理解为是一个镜像的一个实例,本质是一个进程,可以创建,启动,停止,销毁