文章目录
::: tip 简介
Docker是一种开源的应用容器引擎,让开发者能够打包应用及其依赖包到一个可移植的容器中,然后发布到任何流行的Linux或Windows机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。这种技术可以保证包的快速、可靠、一致的交付,无论环境如何。
:::
一、安装
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
验证是否安装成功
sudo docker run hello-world
如上所示代表安装成功。
如果出现网络原因问题如下:
这个错误表明 Docker 无法从 Docker Hub (registry-1.docker.io) 拉取 hello-world 镜像,原因是 网络连接超时(context deadline exceeded)。这通常是由于 国内访问 Docker Hub 受限 或 服务器网络配置问题 导致的。
可选择阿里云加速镜像源https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors,或直接开启科学上网。
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": [
"https://docker.mirrors.ustc.edu.cn",
"https://hub-mirror.c.163.com",
"https://registry.docker-cn.com",
"https://mirror.baidubce.com"
]
}
EOF
二、Docker命令
镜像
docker pull
:拉取镜像
# 下载官方Nginx镜像,默认下载最新版
docker pull nginx
docker images
:查看所有镜像docker rmi xxx
: 删除镜像(跟上镜像名、镜像ID前两位等均可)
容器
docker ps -a
:查看所有容器docker logs -f xxx
:查看容器日志
docker run -d --name 创建的容器名 镜像名(一般镜像名放最后)
# 创建Nginx容器,把本机的80端口绑定到容器的80端口
docker run -d --name nginx -p 80:80 nginx
# `-d`:表示以后台运行的方式创建容器
- 配置环境变量
-e
:设置MySQL连接密码、时区
docker run --name mysql -e MYSQL_ROOT_PASSWORD=admin111 -e TZ=Asia/Shanghai -d -p 3307:3306 mysql
- 配置
restart
重启策略always
: 只要docker重启那么容器就重启unless-stopped
: 除了手动停止容器后,不会重启外,其他情况docker重启,容器重启
docker run -d --restart unless-stopped nginx
- 进入容器
# 以交互模式进入创建的Nginx容器
docker exec -it nginx bash
- 停止容器
docker stop nginx
- 启动容器
docker start nginx
# 重启容器
docker restart nginx
- 基于容器创建新的镜像
docker commit -m '说明' 容器ID 新镜像名
数据卷管理
- 创建容器时挂载数据卷,如果实在Windows上用的Docker Desktop,请注意挂载路径写法
# 将宿主机上的`/root/shared_file`目录挂载到容器的`/home/shred_file`下
docker run -d --name ubuntu -v /root/shared_file:/home/shred_file ubuntu
网络模式
默认三种模式:
bridge
: 网桥模式。即每个容器都会有一个独立的IP,容器之间,容器与宿主机之间可通过网桥实现通信。默认创建的容器都是网桥模式host
: 主机模式。容器没有独立的IP地址,直接使用宿主机的IP地址,该容器就相当于宿主机的一个进程none
: none模式,通常不用,代表该容器没有网络,宿主机和容器,容器和容器之间没法通过网络通信
通过docker inspect xxx
查看容器配置信息如下
- 创建子网
# 创建一个自定义网络network1
docker network create network1
三、Dockerfile
- 以在Docker中运行一个
Flask
项目为例
Dockerfile
构建代码如下:
# 拉取镜像
FROM python:3.13-slim
# 切换到即将创建容器中的app目录下
WORKDIR /app/
# 将当前目录下文件拷贝到容器所在目录下(即上面的app目录)
COPY . .
# 下载依赖包
RUN pip install -i https://mirrors.aliyun.com/pypi/simple/ -r requirements.txt
# 定义环境变量
ENV FLASK_APP=app.py
ENV FLASK_RUN_HOST=0.0.0.0
ENV TZ=Asia/Shanghai
# 声明会使用的端口
EXPOSE 5000
# 运行的命令
CMD ["flask","run"]
- 然后构建镜像
docker build -t flask-demo .
- 启动容器
docker run -d --name flask-web -p 5000:5000 flask-demo
推送至镜像仓库
以阿里云镜像仓库为例,如果使用的是阿里云系列产品,可选择切换内网地址,速度会快些。
docker login --username=子午技术组 crpi-xxx.cn-hangzhou.personal.cr.aliyuncs.com
docker tag [ImageId] crpi-xxx.cn-hangzhou.personal.cr.aliyuncs.com/ziwu/ziwu-docker:[镜像版本号]
docker push crpi-xxx.cn-hangzhou.personal.cr.aliyuncs.com/ziwu/ziwu-docker:[镜像版本号]
阿里云ECI弹性容器部署
如果需要把容器运行时,公网可以访问到,那么可以借助阿里云ECI容器部署https://www.aliyun.com/product/eci, 然后通过生成的IP地址就可以访问到了。
阿里云Serverless应用引擎SAE部署
参考:https://saenext.console.aliyun.com/
注意:需要提前配置好弹性IP,安全组
这个相比于ECI部署,可以动态进行弹性扩容,多实例运行,直接通过compose文件生成容器等。
阿里云FC函数部署容器
这个相比于其他两个价格最低,但是功能受限,仅适合部署API服务等接口。并且经过实践FC3.0的版本好像一直部署不成功,2.0版本可以。
四、Docker Compose
在实际的部署工作中,需要使用到多种服务,比如mysql、nginx等,那这么多镜像如何进行组合编排呢,这就是Docker-Compose需要解决的问题。
使用+典型案例:
使用Docker-Compose编排容器时,可以将编排指令放到compose.yaml文件中。这里以构建一个构建Flask+Redis的服务的过程为例来讲解Docker-Compose的使用。
创建一个文件夹,叫做app文件夹,并在里面创建一个app.py文件,目录结构如下:
flask-redis-demo/
│── app/
│ ├── app.py
│ ├── requirements.txt
│ └── Dockerfile
│── docker-compose.yml
- Flask 应用 (app/app.py)
from flask import Flask
import redis
import os
app = Flask(__name__)
# 连接 Redis
redis_host = os.getenv("REDIS_HOST")
r = redis.Redis(host=redis_host, port=6379, decode_responses=True)
@app.route("/")
def hello():
# 自增计数器
count = r.incr("hits")
return f"Hello! This page has been visited {count} times."
if __name__ == "__main__":
app.run(host="0.0.0.0", port=5000)
- 依赖文件 (app/requirements.txt)
flask
redis
- Flask 的 Dockerfile (app/Dockerfile)
# 拉取镜像
FROM python:3.13-slim
# 切换到即将创建容器中的app目录下
WORKDIR /app/
# 将当前目录下文件拷贝到容器所在目录下(即上面的app目录)
COPY . .
# 下载依赖包
RUN pip install -i https://mirrors.aliyun.com/pypi/simple/ -r requirements.txt
# 定义环境变量
ENV TZ=Asia/Shanghai
# 声明会使用的端口
EXPOSE 5000
# 运行的命令
CMD ["python3","app.py"]
- Docker Compose 配置 (docker-compose.yml)
# 名称
name: demo
# 服务列表
services:
# web服务配置
web:
# web服务的Dockerfile文件路径
build: ./app
# 端口映射
ports:
- "5000:5000"
# 容器名称
container_name: "web"
# 环境变量传递 Redis 服务名
environment:
- REDIS_HOST=redis
# 在遇到意外情况退出后是否重启
restart: unless-stopped
# 本服务依赖的服务,必须redis服务启动后,web服务才会启动
depends_on:
- redis
# redis服务
redis:
# 使用的镜像,如本地没有,则会从docker官网上拉取
image: "redis:alpine"
# 容器名称
container_name: "web_redis"
# 是否重启
restart: unless-stopped
compose相关命令:
- 检查配置是否有错
docker compose config
- 创建和启动容器
docker compose up -d
- 停止和移除容器(尽量不要用这个停止,因为会删除容器)
docker compose down
- 停止compose
docker compose stop 【service name】
- 启动compose
docker compose start 【service name】
- 查看运行中的compose
# 加上 -a可以查看所有compose
docker compose ls