Skip to content

docker

目录


⭐⭐⭐⭐docker hub 仓库 ⭐⭐⭐⭐

参考资料:

笔记

docker 和虚拟机不同,虚拟机需要模拟底层的系统,docker 不需要,docker 是容器技术的实现(docker≠ 容器技术)

docker 是 c/s 结构的,由 docker daemon 作为 server 管理镜像(image)和容器(containers)的运行,客户端是单独的程序,可以是命令行的,也可以带 UI 的,有 web 版的 UI 比如 Portainer | github

docker 有镜像和容器的概念,镜像是一个只读的模板,容器是一个运行时的实例,一个镜像可以生成多个容器。

安装

Docker 引擎 + Docker Desktop

首先推荐官方的安装方法,并直接连同 docker 桌面程序一起安装

官方页面 | Ubuntu 下安装获取.deb安装包

bash
sudo apt-get update
sudo apt-get install ./docker-desktop-<version>-<arch>.deb

# 打开 docker Desktop
systemctl --user start docker-desktop

# 开机自启
systemctl --user enable docker-desktop

仅安装 docker engine

参考资料:

bash
# 删除旧版本和依赖
for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done

# Add Docker's official GPG key:
sudo apt-get update
sudo apt-get install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc

# Add the repository to Apt sources:
echo  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] 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

# Install Docker Engine:
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

测试安装

bash
# 查看 docker 版本
docker --version
# 查看 docker compose 版本
docker compose version
# 查看 docker 信息
docker version
# 运行一个测试容器
docker run hello-world

使用

镜像 | images

bash
# 查看本地镜像
docker images

# 拉取一个镜像
docker pull <image>:<tag>

# 导出一个镜像
docker save -o <filename.tar> <image>

# 导入一个镜像
docker load -i <tar文>


# 删除一个镜像
docker rmi <image>

运行

docker run

使用 run 命令可以创建一个已某个镜像为基础的容器

bash
# tag 可以省略,默认为 latest
docker run [OPTIONS] <image>:<TAG>  [COMMAND] [ARG...]

参数请放在镜像名前面

常用运行参数:

  • -d 后台运行
  • -p 端口映射 hostPort:containerPort
    • eg: -p 8080:80 将容器的 80 端口映射到主机的 8080 端口
    • eg2: -p 8080-8085:80 将容器的 80 端口映射到主机的 8080-8085 端口
    • eg3: -p 8080:80/udp 将容器的 80 端口映射到主机的 8080 端口,并且设置为允许 udp 协议
  • --name 容器名
  • -v 挂载卷 hostPath:containerPath
    • eg: -v /data:/data 将主机的 /data 目录挂载到容器的 /data 目录
    • eg2: -v /data:/data:ro 将主机的 /data 目录挂载到容器的 /data 目录,并且只读
    • eg3: -v /data:/data:z 将主机的 /data 目录挂载到容器的 /data 目录,并且设置为 z 类型
  • -e 环境变量
    • eg: -e MYSQL_ROOT_PASSWORD=123456 设置 mysql 的 root 密码
    • eg2: -e TZ=Asia/Shanghai 设置时区
    • eg3: -e LANG=zh_CN.UTF-8 设置语言
  • --restart 重启策略 no|on-failure[:max-retries]|always|unless-stopped
  • --network 网络模式 bridge|host|none

容器 | containers

bash
# 查看运行中的容器
docker ps

# 查看所有容器
docker ps -a

# 暂停一个容器
docker pause <container>

# 恢复一个容器
docker unpause <container>

# 停止一个容器
docker stop <container>

# 启动一个容器
docker start <container>

# 删除一个容器
docker rm [-f] <container> # -f 强制删除,即使容器在运行

# 进入一个容器
docker exec -it <container> /bin/bash

# 退出镜像
exit 或者 Ctrl+P+Q

# 导出容器
docker export <container> > <filename>.tar

# 导入容器
docker import <filename>.tar <image>:<tag>

使用 export 导出的容器需要用 import 导入,而用 save 导出的镜像需要用 load 导入,混用会报错

持久化

参考资料:

bind mount 方式用绝对路径 -v D:/code:/app

volume 方式,只需要一个名字 -v db-data:/app

网络

参考资料:

代理

当前国内难以访问 docker hub,各大镜像网站也纷纷关闭,只能使用代理来访问

因为 docker 是跑在守护进程里的,也就是跑在 systemd 下的,所以我们可以通过 systemd 来设置代理

bash
sudo vim /etc/systemd/system/docker.service.d/proxy.conf

输入以下内容:

conf
[Service]
Environment="HTTP_PROXY=http://127.0.0.1:7890/"
Environment="HTTPS_PROXY=http://127.0.0.1:7890/"
Environment="NO_PROXY=localhost,127.0.0.1,.example.com"

然后重启 docker 服务

bash
sudo systemctl daemon-reload
sudo systemctl restart docker

参考资料:

Copyright © 2022 田园幻想乡 浙ICP备2021038778号-1