Docker 技术
1. 基本概念
- 容器:每个容器拥有自己的文件系统、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安装
2.5 运行docker
-
sudo systemctl start docker
开启docker服务 -
docker ps
查看正在运行的docker -
sudo sysetmctl enable docker
将docker加入开机自启动
-
可以配置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 镜像操作
docker search
检索镜像docker pull
下载镜像docker images
镜像列表docker rmi
删除镜像
3.2 容器操作
docker run
运行(实质是创建一个容器)docker ps
查看运行中容器docker stop/start/restart
停止、启动、重启docker status
状态docker logs
日志docker exec
进入docker rm
删除docker ps -a
查看所有容器
3.3 Run命令细节(创建容器细节)
docker run -d
后台启动docker run --name
起别名docker run -p <主机端口>:<容器端口>
端口映射docker exec -it <容器名称> bash
cd /bin/bash
以交互模式进入容器内部,以exit退出
3.4 将容器保存为镜像
docker commit
提交docker save
保存docker save -o "*.tar" <docker image name>
docker load
加载docker load -i *.tar
3.5 分享docker到社区
docker login
输入账号密码- 重命名
docker tag 原名称版本 重命名名称版本
docker push 名称+版本
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容器集群
- 使用
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 自制镜像
使用Dockerfile
建立镜像的所有操作指令
使用.dockerignore
设定例外
- 常见指令
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
nano /etc/ssh/sshd_config
- 添加
PermitRootLogin yes
systemctl restart ssh
- 进入管理员
sudo -i
参考文献
以下网页、视频、工具,在不同程度帮助我学习了本文章的内容,在此对提供帮助的技术前辈表示感谢~