Skip to content

Docker 使用笔记

Docker 安装

清华的镜像安装

shell
export DOWNLOAD_URL="https://mirrors.tuna.tsinghua.edu.cn/docker-ce"
# 如您使用 curl
curl -fsSL https://get.docker.com/ | sh
# 如您使用 wget
wget -O- https://get.docker.com/ | sh

CentOS 安装 Docker

以下是 docker 官网的安装教程,我只是将命令都提取出来

按下列顺序逐步输入即可

shell
sudo yum install -y yum-utils
shell
sudo yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo

如果下载速度太慢的话可以用阿里云的镜像

shell
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
shell
sudo yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin
shell
sudo systemctl start docker

验证docker​ 是否成功安装

shell
sudo docker run hello-world

Ubuntu 安装 Docker

以下是 docker 官网的安装教程,我只是将命令都提取出来

按下列顺序逐步输入即可

shell
sudo apt-get update
shell
sudo apt-get install \
    ca-certificates \
    curl \
    gnupg \
    lsb-release
shell
sudo mkdir -p /etc/apt/keyrings
shell
 curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

国内源

shell
curl -fsSL https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
shell
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

国内源

shell
sudo add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
shell
sudo apt-get update
shell
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin

验证docker​ 是否成功安装

shell
sudo docker run hello-world

若出现

image-20230223135228027

输入

shell
sudo usermod -aG docker $USER
newgrp docker

即可。

Docker 常用命令

  • docker pull mysql:latest​:拉取一个镜像

  • docker images​:列出本地所有镜像

  • docker image rm mysql:latest​ 或 docker rmi mysql:latest​:删除镜像mysql:latest

  • docker [container] commit CONTAINER IMAGE_NAME:TAG​:创建某个container​ 的镜像

  • docker save -o gettler.tar mysql:latest​:将镜像mysql:latest​ 导出到本地文件gettler.tar​ 中

  • docker load -i gettler.tar​:将镜像mysql:latest​ 从本地文件gettler.tar​ 中加载出来

  • docker [container] create -it mysql:latest​:利用镜像mysql:latest​ 创建一个容器。

  • docker ps -a​:查看本地的所有容器

  • docker [container] start CONTAINER​:启动容器

  • docker [container] stop CONTAINER​:停止容器

  • docker [container] restart CONTAINER​:重启容器

  • docker [contaienr] run -itd mysql:latest​:创建并启动一个容器

  • docker [container] attach CONTAINER​:进入容器

  • 先按 Ctrl-p,再按 Ctrl-q 可以挂起容器

  • docker [container] exec CONTAINER COMMAND​:在容器中执行命令

  • docker [container] rm CONTAINER​:删除容器

  • docker container prune​:删除所有已停止的容器

  • docker export -o xxx.tar CONTAINER​:将容器CONTAINER​ 导出到本地文件xxx.tar​ 中

  • docker import xxx.tar image_name:tag​:将本地文件xxx.tar​ 导入成镜像,并将镜像命名为image_name:tag

  • docker export/import​ 与docker save/load​ 的区别:

    • export/import​ 会丢弃历史记录和元数据信息,仅保存容器当时的快照状态
    • save/load 会保存完整记录,体积更大
  • docker top CONTAINER​:查看某个容器内的所有进程

  • docker stats​:查看所有容器的统计信息,包括 CPU、内存、存储、网络等信息

  • docker cp xxx CONTAINER:xxx​ 或 docker cp CONTAINER:xxx xxx​:在本地和容器间复制文件

  • docker rename CONTAINER1 CONTAINER2​:重命名容器

  • docker update CONTAINER --memory 500MB​:修改容器限制

  •     docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
    • OPTIONS 说明:

      • -d: 后台运行容器,并返回容器 ID;
      • -i: 以交互模式运行容器,通常与 -t 同时使用;
      • -P: 随机端口映射,容器内部端口随机映射到主机的端口
      • -p: 指定端口映射,格式为:主机(宿主)端口:容器端口
      • -t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
    • 例如:docker run -p 20000:22 -p 8000:8000 --name django_server -itd django_lesson:1.0​ 运行django_lesson:1.0​ 镜像

Docker 数据卷

数据卷概念

  1. 数据卷是宿主机中的一个文件或目录
  2. 当容器目录和数据卷目录绑定后,对方的修改会立即同步
  3. 一个数据卷可以被多个容器挂载
  4. 一个容器可以挂载多个数据卷

数据卷作用

  1. 容器数据持久化
  2. 外部机器和内部容器间接通信
  3. 容器之间进行数据交换

配置数据卷

docker run ... -v 宿主机文件:容器内文件

1. 目录必须是绝对路径

2. 如果目录不存在,会自动创建

3. 可以挂载多个数据卷

Docker 镜像

image-20221122154536116

image-20221122153358943

Docker 网络设置

网络模式

网络模式配置说明
bridge 模式--net=bridge(默认为该模式)此模式会为每一个容器分配、设置 IP 等,并将容器连接到一个 docker0 虚拟网桥,通过 docker0 网桥以及 Iptables nat 表配置与宿主机通信。
host 模式--net=host容器和宿主机共享 Network namespace。
container 模式--net=container:NAME_or_ID容器和另外一个容器共享 Network namespace。 kubernetes 中的 pod 就是多个容器共享一个 Network namespace。
none 模式--net=none该模式关闭了容器的网络功能。

将容器连接到网络

shell
docker network connect

断开容器的网络

shell
docker network disconnect

不指定网络驱动时默认创建的 bridge 网络

shell
docker network create my_net

查看网络内部信息

shell
docker network inspect my_net
**```

列所有列表的网络

```shell
docker network ls

移除指定的网络

shell
docker network rm my_net

运行容器并连接自定义的网络

shell
docker run -itd --network=my_net --ip 192.168.21.100 -e MYSQL_ROOT_PASSWORD=123456  --name mysql mysql:8.0

Docker 配置镜像源

vim /etc/docker/daemon.json​ 添加以下内容:

yaml
{
  "registry-mirrors": [
    "https://hub-mirror.c.163.com",
    "https://ustc-edu-cn.mirror.aliyuncs.com",
    "https://ghcr.io",
    "https://mirror.baidubce.com"
  ]
}
yaml
{
    "registry-mirrors": [
        "https://dockerproxy.com",
        "https://hub-mirror.c.163.com",
        "https://mirror.baidubce.com",
        "https://ccr.ccs.tencentyun.com"
    ]
}
{
          "insecure-registries": ["192.168.30.12"]
}

Docker 实操记录

配置阿里云镜像

shell
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://u5po9ti9.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

Docker 安装 MySQL

先拉取官方的最新版本的镜像:

shell
docker pull mysql:latest

image-202205281a51700539

运行容器

shell
docker run -itd --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=73748156 mysql
shell
docker run -itd -e MYSQL_ROOT_PASSWORD=73748156  --restart=always --name mysql -v /data/mysql/my.cnf:/etc/mysql/my.cnf -v /data/mysql/data:/var/lib/mysql -p 3306:3306 mysql:5.7

 docker exec -it mysql /bin/bash
 mysql -u root -p
 73748156
 create user 'power'@'%' identified by '73748156';
     grant all privileges on *.* to 'power'@'%';
 use mysql
 update user set host = "localhost" where user = "root" and host = "%";
 delete from user where user = "root" and host = "%";
 flush privileges;

Docker 安装 Redis

shell
docker run --restart=always --name redis -v /data/redis/redis.conf:/etc/redis/redis.conf -v /data/redis/data:/data -p 6379:6379 -d redis:latest redis-server /etc/redis/redis.conf --requirepass 73748156 --appendonly yes

Docker 部署 Nacos (单机)

shell
docker run -it --name nacos -p 8848:8848 -e MODE=standalone -v D:\EnvironmentFiles\DockerFile\nacos\conf:/home/nacos/conf -v D:\EnvironmentFiles\DockerFile\nacos\data:/home/nacos/conf/data -v D:\EnvironmentFiles\DockerFile\nacos\logs:/home/nacos/conf/logs -d nacos/nacos-server:1.1.3

Docker 部署 Portainer

shell
docker run -d -p 9000:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v /data/portainer/data:/data --name portainer portainer/portainer

Finish!

Yeah,that's all.

Docker 部署 jupyter notebook

shell
docker pull jupyter/base-notebook
shell
docker run -d -p 8888:8888 --name jupyter_server jupyter/base-notebook:latest

So easy!

Docker 部署 v2raya

shell
docker run -d --restart=always -p 2017:2017 -p 20170-20172:20170-20172   --privileged --name v2raya -e V2RAYA_LOG_FILE=/data/v2raya/v2raya.log -v /lib/modules:/lib/modules -v /data/v2raya/v2raya:/etc/v2raya mzz2017/v2raya
shell
docker run -d \
  --restart=always \
  --privileged \
  --network=host \
  --name v2raya \
  -e V2RAYA_LOG_FILE=/tmp/v2raya.log \
  -e V2RAYA_V2RAY_BIN=/usr/local/bin/v2ray \
  -e V2RAYA_NFTABLES_SUPPORT=off \
  -e IPTABLES_MODE=legacy \
  -v /lib/modules:/lib/modules:ro \
  -v /etc/resolv.conf:/etc/resolv.conf \
  -v /etc/v2raya:/etc/v2raya \
  mzz2017/v2raya

Docker 部署 Minio

shell
docker run -p 9000:9000 -p 9090:9090 \
     --net=host \
     --name minio \
     -d --restart=always \
     -e "MINIO_ACCESS_KEY=Gettler" \
     -e "MINIO_SECRET_KEY=73748156" \
     -v /data/minio/data:/data \
     -v /data/minio/config:/root/.minio \
     minio/minio server \
     /data --console-address ":9090" -address ":9000"

Docker 部署 NextCloud

shell
docker run -d --name nextcloud -p 8000:80 -v /data/nextcloud:/var/www/html nextcloud

nextcloud 安装 外部存储插件

docker exec -it nextcloud bash

apt-get update
apt-get upgrade

apt install smbclient libsmbclient-dev
pecl install smbclient
docker-php-ext-enable smbclient

Docker 搭建 headscale

version: '3'

services:
    headscale:
        image: headscale/headscale:latest
        container_name: headscale
        command: headscale serve
        restart: unless-stopped
        volumes:
            - /opt/headscale/config:/etc/headscale/
            - /opt/headscale/data:/var/lib/headscale/
        ports:
            - "17654:8080"

    headscale-ui:
        image: ghcr.io/gurucomputing/headscale-ui:latest
        restart: unless-stopped
        container_name: headscale-ui
        ports:
            - "15645:80"

Docker 搭建 OpenProject

shell
docker run -d -p 80:8080  -p 5432:5432 --name openproject   -e OPENPROJECT_HOST__NAME=192.168.30.116   -e SECRET_KEY_BASE=OUnKLrb7lrN6FU9CuSjWpDe2UjsfNSdr   -v /var/lib/openproject/pgdata:/var/openproject/pgdata -e OPENPROJECT_HTTPS=false   -v /var/lib/openproject/assets:/var/openproject/assets   192.144.231.250:3080/hub-proxy/openproject/openproject:17

Docker 搭建 Jenkins

shell
docker run --name=jenkins --hostname=2540711260d3 --user=jenkins   --group-add 988 --mac-address=f2:77:bc:71:c0:52 --volume /usr/bin/docker:/usr/bin/docker --volume /data/jenkins_home:/var/jenkins_home --volume /var/run/docker.sock:/var/run/docker.sock --env=TZ=Asia/Shanghai --network=bridge -p 50000:50000 -p 8080:8080 --restart=always --runtime=runc --detach=true 192.168.30.12/proxy/jenkins/jenkins:lts-jdk17