跳到主要内容

Docker使用攻略

基本概念

Docker 是一种容器虚拟化技术,它可以将应用程序及其依赖项打包到一个可移植的容器中,并运行在任何支持 Docker 的环境中。

  • 镜像:镜像(image)是 Docker 创建的模板,包含了运行容器所需的所有内容,如操作系统、应用程序、依赖项和配置文件。
  • 容器:容器(container)是镜像(image)的运行实例,容器是可移植的、自包含的、可重复的运行环境。
  • 仓库:仓库(repository)是存放镜像的仓库,可以是本地的,也可以是远程的。

Docker 安装

进入网站https://get.docker.com/,按照要求执行第一步和第四步

curl -fsSL https://get.docker.com -o get-docker.sh
sudo bash get-docker.sh
注意
  • 所有的docker命令都需要sudo权限
  • 如果请求失败,可以尝试以下的方式
    curl -fsSL https://raw.githubusercontent.com/docker/docker-install/master/install.sh -o get-docker.sh

Docker 镜像加速

镜像加速器可以加速 Docker 镜像的下载,从而提高镜像的拉取速度。

sudo vim /etc/docker/daemon.json

输入下述内容:

{
"registry-mirrors": [
"https://docker.m.daocloud.io",
"https://docker.xuanyuan.me",
"https://docker.1ms.run"
]
}

保存并退出文件,然后重启 Docker 服务:

sudo service docker restart

Docker 常用命令

镜像

下载镜像

sudo doccker pull <image_name>
  • 可以前往https://hub.docker.com/查找更多镜像。
  • 对于特定平台架构的镜像,需要加入参数--platform,示例:
    sudo docker pull --platform linux/amd64 <image_name>

列出所有镜像

sudo docker images

删除镜像

sudo docker rmi <image_name> or <image_id>

容器

启动容器

sudo docker run -d <image_name>
  • -d 后台运行
  • -p<host_port>:<container_port> 映射端口
  • -v <host_path>:<container_path> 挂载卷,映射目录;这样可以保证容器被删除的时候,对应的数据不会丢失,做持久化保存;主机和容器之前的修改会同步 我们也可以生成一个挂载卷,并挂载到容器中,
    sudo docker volume create <volume_name>
    sudo docker run -d -v <volume_name>:<container_path> <image_name>
    sudo docker volume inspect <volume_name> # 查看卷信息
    sudo docker volume list # 查看所有卷
    sudo docker volume rm <volume_name> # 删除卷
  • -e <env_name>=<env_value> 设置环境变量
  • --name <container_name> 设置容器名称,名称不能重复
  • -it 交互式运行,表示启动一个交互式终端
  • --rm 停止容器时,会自动删除容器;一般和-it一起使用,用于临时运行一个容器
  • --restart <policy> 设置容器重启策略,always:总是重启;unless-stopped:除非手动停止,否则一直重启
  • --network <network_name> 把容器加入到这个子网中

查看进程状态

sudo docker ps -a
  • -a 显示所有容器,包括停止的容器

创建容器

sudo docker create 《image_name>

停止容器

sudo docker stop <container_id> or <container_name>

启动容器

sudo docker start <container_id> or <container_name>

删除容器

sudo docker rm <container_id> or <container_name>
  • -f 强制删除,对于正在运行的容器,需要加上此参数

运行命令

sudo docker exec <container_id> or <container_name> <command>

例如进入容器中运行命令

sudo docker exec -it <container_id> or <container_name> bash

查看容器信息

sudo docker inspect <container_id> or <container_name>

查看容器日志

sudo docker logs <container_id> or <container_name> -f
  • -f 跟随日志,实时查看日志

Dockerfile

Dockerfile 是 Docker 镜像的构建文件,它定义了镜像的构建步骤,包括安装软件、设置环境变量、复制文件、运行命令等。

Dockerfile 语法

FROM <base_image>

WORKDIR <working_directory>

COPY <source> <destination>

RUN <command>

EXPOSE <port>

CMD ["command"]

制作镜像

  1. 创建 Dockerfile 文件
  2. 运行命令,<tag> 为镜像的版本号,可以省略
    sudo docker build -t <image_name>:<tag> .
  3. 如果需要推送镜像到仓库,需要先登录仓库
    sudo docker login
    sudo docker build -t <username>/<image_name>:<tag> .
    sudo docker push <user_name>/<image_name>:<tag>

Docker 网络

bridge 模式(桥接)

Docker 默认使用 bridge 网络模式,即每个容器都有自己的网络接口,并分配一个 IP 地址,一般为172.17.0.x。在容器之间可以通过 IP 地址进行通信,但容器和主机之间的网络是隔离的,无法进行通信。

我们可以使用docker network create命令创建一个自定义的网络,并把容器加入到这个网络中。一个子网络可以有多个容器,容器之间可以通过 IP 地址或者容器名称(容器内部的DNS机制)进行通信;不同的子网络之间无法进行通信。

sudo docker network create <network_name>
sudo docker run -d -p 80:80 --network <network_name> <image_name>

host 模式

host 模式将容器的网络与主机的网络进行绑定,容器和主机的网络是共享的,不需要使用-p进行端口映射。

none 模式

none 模式将容器的网络关闭,容器将无法访问网络,只能通过容器内部进行通信。

常用命令

sudo docker network create <network_name> # 创建网络
sudo docker network list # 列出所有网络
sudo docker network rm <network_name> or <network_id> # 删除网络

Docker Compose

Docker Compose 是一个用于定义和运行多个 Docker 容器的开源工具。它可以将多个容器组合成一个应用,并使用docker-compose.yml文件进行配置。

下面是一个简单的docker-compose.yml文件,用于定义一个包含两个容器的 Docker 应用:

services:
frontend:
image: <image_name>
ports:
- "8080:8080"
environment:
- "ADMIN_USER=admin"
- "ADMIN_PASSWORD=password"
depends_on:
- "backend"

backend:
image: <image_name>
environment:
- "DB_HOST=db"
- "DB_PORT=3306"
volumes:
- "./data:/data"
提示

一个compose文件里面的容器会自动加入一个子网

最后运行命令,启动compose文件

sudo docker-compose up -d # 启动
sudo docker-compose down # 停止并删除所有容器
sudo docker-compose stop # 停止容器
sudo docker-compose start # 启动容器
sudo docker-compose logs -f # 查看日志