【计基】【Docker】容器化部署简易教程

Docker 技术

1. 基本概念

Dokcer基本概念

  • 容器:每个容器拥有自己的文件系统、CPU、内存、进程空间。可以轻量级、跨平台、快速部署。
  • 镜像:容器的安装文件
    镜像间转换

2. 安装Docker

2.1 使用官方网址

访问 https://www.docker.com/
(实际使用的是https://docs.docker.com/engine/install/ubuntu/)

2.2 删除旧有的docker

for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done

2.3 使用国内仓库下载

此处考虑国内网络问题,使用阿里云的镜像源

# step 1: 安装必要的一些系统工具
sudo apt-get update
sudo apt-get install ca-certificates curl gnupg

# step 2: 信任 Docker 的 GPG 公钥
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg

# Step 3: 写入软件源信息
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://mirrors.aliyun.com/docker-ce/linux/ubuntu \
  "$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
 

2.4 验证docker安装

验证Docker

2.5 运行docker

  1. sudo systemctl start docker 开启docker服务

  2. docker ps 查看正在运行的docker

  3. sudo sysetmctl enable docker将docker加入开机自启动
    加入开机启动

  4. 可以配置docker源镜像,但国内云服务商普遍将该服务限制在内部服务器,此处只进行记录
    安装 Docker 并配置镜像加速源-腾讯云

PS 配置轩辕镜像

写于2025/02/19 该镜像能够正常拉取,该字段不做任何推荐与担保,用于生产环境时需谨慎;但同时表达对互联网精神的极大赞扬与感激。[轩辕镜像](https://docker.xuanyuan.me/)  

修改 /etc/docker/daemon.json,设置 registry mirror,具体命令如下:

nano  /etc/docker/daemon.json 

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

重启docker

systemctl daemon-reload
systemctl restart docker

3. 命令操作

下载镜像-启动容器-修改页面-保存镜像-分享在社区

3.1 镜像操作

  1. docker search 检索镜像
  2. docker pull 下载镜像
  3. docker images 镜像列表
  4. docker rmi 删除镜像

3.2 容器操作

  1. docker run 运行(实质是创建一个容器)
  2. docker ps 查看运行中容器
  3. docker stop/start/restart停止、启动、重启
  4. docker status状态
  5. docker logs日志
  6. docker exec进入
  7. docker rm删除
  8. docker ps -a 查看所有容器

3.3 Run命令细节(创建容器细节)

  1. docker run -d 后台启动
  2. docker run --name 起别名
  3. docker run -p <主机端口>:<容器端口>端口映射
  4. docker exec -it <容器名称> bash cd /bin/bash 以交互模式进入容器内部,以exit退出

3.4 将容器保存为镜像

  1. docker commit 提交
  2. docker save 保存docker save -o "*.tar" <docker image name>
  3. docker load 加载 docker load -i *.tar

3.5 分享docker到社区

  1. docker login输入账号密码
  2. 重命名docker tag 原名称版本 重命名名称版本
  3. docker push 名称+版本
  4. docker pull

4. 存储

4.1 目录挂载

run …… -v /app/nghtml(本机):/usr/share/nginx/html(容器)
创建容器前挂载;即将虚拟机的快捷方式指向主机中的一个文件/文件夹

4.2 卷映射

-v ngconf:/etc/nginx

  • 本机地址不以/开头
  • 卷挂载在var/lib/docker/volumes/<volume-name>
  • 相当于快捷方式放在主机,指向容器内部

对于1/2,删除容器,对于的内容均不会被删除

5. 网络

  • 查询命令ip a
  • docker 0 就是docker内部的分发机制
  • docker inspect <name> 查看某个虚拟机的详细信息(包括IP地址)
  • 使用内部网络互相访问时,端口用默认端口
  • 删除全部容器docker rm -f $(docker ps -aq)

5.1 创建自定义网络

  • docker network create 网络名称
  • docker run ^ --network 网络名称 加入到某自定义网络
  • 此时可以直接使用容器名做域名,互相内部访问

5.2 【示例】Redis容器集群

Redis容器集群导图

  • 使用bitnami的redis镜像

5.2.1 建立主集群

#自定义网络
docker network create mynet
#主节点
docker run -d -p 6379:6379 \
-v /app/rd1:/bitnami/redis/data \
-e REDIS_REPLICATION_MODE=master \
-e REDIS_PASSWORD=123456 \
--network mynet --name redis01 \
bitnami/redis

5.2.2 给文件目录改权限

chmod -R 777 /app\rd1

docker restart redis01

# 添加给2号机的配置文件夹
mkdir rd2
chmod -R 777 rd2

5.2.3 从集群

#从节点
docker run -d -p 6380:6379 \
-v /app/rd2:/bitnami/redis/data \
-e REDIS_REPLICATION_MODE=slave \
-e REDIS_MASTER_HOST=redis01 \
-e REDIS_MASTER_PORT_NUMBER=6379 \
-e REDIS_MASTER_PASSWORD=123456 \
-e REDIS_PASSWORD=123456 \
--network mynet --name redis02 \
bitnami/redis

6. Docker compose

使用compose.yaml批量管理容器
Docker官方指导

顶级元素 顶级元素
name 名字
services 服务
networks 网络
volumes
configs 配置
secret 密钥

6.1 【示例】WordPress

name: myblog
services:
  mysql:
    container_name: mysql
    image: mysql:8.0
    ports:
      - "3306:3306"
    environment:
      - MYSQL_ROOT_PASSWORD=123456
      - MYSQL_DATABASE=wordpress
    volumes:
      - mysql-data:/var/lib/mysql
      - /app/myconf:/etc/mysql/conf.d
    restart: always
    networks:
      - blog

  wordpress:
    image: wordpress
    ports:
      - "8080:80"
    environment:
      WORDPRESS_DB_HOST: mysql
      WORDPRESS_DB_USER: root
      WORDPRESS_DB_PASSWORD: 123456
      WORDPRESS_DB_NAME: wordpress
    volumes:
      - wordpress:/var/www/html
    restart: always
    networks:
      - blog
    depends_on:
      - mysql

volumes:
  mysql-data:
  wordpress:

networks:
  blog:

使用命令

docker compose -f compose.yaml up/down -d

7. Docker file 自制镜像

Dokcerfile组成

使用Dockerfile建立镜像的所有操作指令
使用.dockerignore设定例外

  • 常见指令
    Dockerfile 常用指令
FROM openjdk:17

LABEL author=leifengyang

COPY app.jar /app.jar

EXPOSE 8080

ENTRYPOINT ["java","-jar","/app.jar"]
  • 使用命令建立
docker build -f Dockerfile -t 镜像+版本 基础路径

注:写Dockerfile的小心思

在使用node.js的docker文件时,一般采取两次copy;其目的是后期构建时,尽量多的使用缓存

8. 镜像分层

镜像间只存储不同的部分(共用部分不重复存储-virtual);容器间也只存储不同部分(即单镜像多容器,占用空间可控)

  • 分层打包
    分层打包

9. 搭建私有Docker仓库

9.1 安装

docker pull registry:latest
mkdir -p registry/data && cd registry
docker run -d \
	--restart=always \
	--name registry \
	-p 5000:5000-v ./data:/var/lib/registryregistry:latestH..


9.2 测试

访问

http://IP:5000/v2/_catalog

9.3 推送镜像

# 重做镜像tag
docker tag images:tag 私有IP:5000/images:tag
# 推送镜像
docker push 私有IP:5000/images:tag
docker pull 私有IP:5000/images:tag

# 在服务器执行
ls /registry /data/docker/registry/v2/repositories

还需更改一个小配置(由于是非https传输),在客户端修改

nano /etc/docker/daemon.json

"insecure-registries":["私有IP:5000"]

小tips

(Ubuntu用ssh访问被Asses Deny)
多半是直接用root身份访问而被拒绝的
0. apt install sshd apt install net-tools

  1. nano /etc/ssh/sshd_config
  2. 添加PermitRootLogin yes
  3. systemctl restart ssh
  4. 进入管理员sudo -i

参考文献

以下网页、视频、工具,在不同程度帮助我学习了本文章的内容,在此对提供帮助的技术前辈表示感谢~

  1. 【尚硅谷3小时速通Docker教程,雷神带练docker部署到实战!】
  2. 阿里云镜像源
  3. 雷锋阳
  4. 【黑马程序员Docker快速入门到项目部署,MySQL部署+Nginx部署+docker自定义镜像+DockerCompose项目实战一套搞定】
  5. 【打造Docker私有镜像仓库】
  6. docker registry(私库)搭建,使用,WEB可视化管理部署