如何部署docker容器
2种的部署方式
docker run
docker run -d --name ddns-go --restart=always --net=host -v /opt/ddns-go:/root jeessy/ddns-godocker run: Docker 命令,用于创建并启动一个新的容器。-d: 以分离模式(后台)运行容器。--name ddns-go: 为容器指定名称ddns-go。--restart=always: 设置容器的重启策略为always,即无论容器以何种方式退出,Docker 都会始终尝试重新启动容器。--net=host: 使用宿主机的网络堆栈。容器将与宿主机共享网络接口,能直接使用宿主机的 IP 和端口。-v /opt/ddns-go:/root: 将宿主机的/opt/ddns-go目录挂载到容器内的/root目录,实现数据持久化和共享。jeessy/ddns-go: 使用jeessy/ddns-go镜像来创建容器。
选项解释
--restart 选项
用于设置容器的重启策略。常见选项包括:
no: 不自动重启容器(默认)。always: 容器停止时总是自动重启。unless-stopped: 除非手动停止,否则总是重启容器。on-failure[:max-retries]: 仅在容器以非零状态退出时重启,最多重启max-retries次。
--net 选项
用于指定容器的网络模式。常见选项包括:
bridge: 默认网络模式,使用 Docker 提供的桥接网络。host: 容器与宿主机共享网络堆栈。none: 容器没有网络连接。container:<name|id>: 让新容器与指定容器共享网络堆栈。network-name: 使用用户定义的网络。
-v 选项
用于挂载卷,使宿主机的目录或文件能够在容器中使用。常见用法包括:
-v /host/path:/container/path: 将宿主机的路径挂载到容器的路径。-v /host/path:/container/path:ro: 只读挂载。-v volume-name:/container/path: 使用命名卷。
通过这条命令,你可以启动一个名为 ddns-go 的 Docker 容器,使用宿主机的网络配置,并确保 /opt/ddns-go 目录中的数据在容器中 /root 路径下可访问且持久化。容器会在异常退出时自动重启以保证服务的持续运行。
docker compose
定义:*Docker Compose 是一个用于定义和运行多容器 Docker 应用的工具。*
功能:
多容器管理:允许用户在一个YAML文件中定义和管理多个容器
服务编排:配置容器间的网络和依赖关系
一键部署:使用docker-compose up命令启动、停止和重建服务
# 下载
curl -L "https://github.com/docker/compose/releases/download/v2.31.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# 国内源
curl -L https://get.daocloud.io/docker/compose/releases/download/v2.31.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
# 开启可执行权限
chmod +x /usr/local/bin/docker-compose
# 查看版本
docker-compose --version
# 如果使用curl方式安装的,这样卸载即可
rm /usr/local/bin/docker-compose
# 查看帮助
docker-compose -h
# 启动所有docker-compose服务
docker-compose up
# 启动所有docker-compose服务并后台运行
docker-compose up -d
# 停止并删除容器、网络、卷、镜像
docker-compose down如何查看日志&debug
# 查看实时日志
docker logs -f 容器id
# 进入容器
docker exec -it 容器id /bin/bashDEMO
portainer
version: "3"
services:
portainer:
image: portainer/portainer:latest
container_name: portainer
ports:
- "9000:9000"
volumes:
- /app/portainer/data:/data
- /var/run/docker.sock:/var/run/docker.sockit-tools
services:
it-tools:
image: qingfeng2336/it-tools:latest
container_name: it-tools
ports:
- 8080:80
restart: unless-stoppedchatnio
version: '3'
services:
mysql:
image: mysql:8.3.0
container_name: db
restart: always
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: chatnio
MYSQL_USER: chatnio
MYSQL_PASSWORD: chatnio123456!
TZ: Asia/Shanghai
expose:
- "3306"
volumes:
- ./db:/var/lib/mysql
networks:
- chatnio-network
redis:
image: redis:latest
container_name: redis
restart: always
expose:
- "6379"
volumes:
- ./redis:/data
networks:
- chatnio-network
chatnio:
image: programzmh/chatnio
container_name: chatnio
restart: always
ports:
- "8000:8094"
depends_on:
- mysql
- redis
links:
- mysql
- redis
ulimits:
nofile:
soft: 65535
hard: 65535
environment:
MYSQL_HOST: mysql
MYSQL_USER: chatnio
MYSQL_PASSWORD: chatnio123456!
MYSQL_DB: chatnio
REDIS_HOST: redis
REDIS_PORT: 6379
REDIS_PASSWORD: ""
REDIS_DB: 0
SERVE_STATIC: "true"
volumes:
- ./config:/config
- ./logs:/logs
- ./storage:/storage
networks:
- chatnio-network
networks:
chatnio-network:
driver: bridgenginx-proxy-manager
version: '3'
services:
app:
image: 'jc21/nginx-proxy-manager:latest'
restart: unless-stopped
ports:
- '80:80'
- '81:81'
- '443:443'
volumes:
- ./data:/data
- ./letsencrypt:/etc/letsencrypt如何开发docker应用程序
docker打包
第一个hello-world程序
创建app.py
from http.server import HTTPServer, BaseHTTPRequestHandler
class SimpleHTTPRequestHandler(BaseHTTPRequestHandler):
def do_GET(self):
self.send_response(200)
self.end_headers()
self.wfile.write(b'Hello, Docker!')
def run(server_class=HTTPServer, handler_class=SimpleHTTPRequestHandler):
server_address = ('', 8000)
httpd = server_class(server_address, handler_class)
httpd.serve_forever()
if __name__ == '__main__':
run()创建Dockerfile
# 使用官方 Python 运行时作为父镜像
FROM python:3.8-slim
# 将当前目录内容复制到容器中的 /app 目录
COPY . /app
# 设置工作目录为 /app
WORKDIR /app
# 将 8000 端口暴露出来
EXPOSE 8000
# 定义环境变量,用于 Python 应用
ENV NAME World
# 运行 Python 应用
CMD ["python", "app.py"]运行服务
docker run -d --name python-http-app-container -p 8001:8000 python-http-app部署一个文件分享服务
步骤 1: 创建 Python HTTP 服务
首先,你需要一个 Python 脚本来提供 HTTP 服务,并确保它能够访问挂载的目录。假设你有一个名为 app.py 的文件,内容如下:
python# app.py
import os
from http.server import HTTPServer, SimpleHTTPRequestHandler
# 设置文件服务目录
os.chdir('/app/share')
# 创建 HTTP 请求处理器
class CustomHTTPRequestHandler(SimpleHTTPRequestHandler):
def end_headers(self):
self.send_header('Cache-Control', 'no-store, no-cache, must-revalidate')
return super().end_headers()
def run(server_class=HTTPServer, handler_class=CustomHTTPRequestHandler):
server_address = ('', 8000)
httpd = server_class(server_address, handler_class)
print("Serving on port 8000")
httpd.serve_forever()
if __name__ == '__main__':
run()步骤 2: 创建 Dockerfile
接下来,创建一个 Dockerfile 来定义你的 Python 环境和应用:
dockerfile# 使用官方 Python 运行时作为父镜像
FROM python:3.8-slim
# 将当前目录内容复制到容器中的 /app 目录
COPY . /app
# 设置工作目录为 /app
WORKDIR /app
# 将 8000 端口暴露出来
EXPOSE 8000
# 运行 Python 应用
CMD ["python", "app.py"]步骤 3: 构建 Docker 镜像
在包含 Dockerfile 和 app.py 的目录中运行以下命令来构建 Docker 镜像:
bash
docker build -t python-http-app .步骤 4: 运行 Docker 容器并挂载目录
使用以下命令运行 Docker 容器,并挂载 /opt/share 目录:
docker run -d --name python-http-app-container -p 8001:8000 -v /opt/share:/app/share:ro python-http-app1-d: 以分离模式运行容器(后台运行)。--name python-http-app-container: 为容器指定名称python-http-app-container。-p 8000:8000: 将容器的 8000 端口映射到宿主机的 8000 端口。-v /opt/share:/app/share:ro: 将宿主机的/opt/share目录挂载到容器的/app/share目录,以只读方式挂载(ro表示只读)。python-http-app: 使用之前构建的镜像。
解释
构建镜像:使用
docker build命令根据 Dockerfile 构建一个包含 Python 环境和你的 HTTP 服务的 Docker 镜像。运行容器:
-d: 容器在后台运行。--name: 为容器指定一个名称。-p 8000:8000: 将容器的 8000 端口映射到宿主机的 8000 端口,使得可以通过宿主机的 8000 端口访问 Python HTTP 服务。-v /opt/share:/app/share:ro: 将宿主机的/opt/share目录挂载到容器的/app/share目录,以只读方式挂载,确保容器内的 HTTP 服务可以访问该目录下的文件。python-http-app: 使用构建的镜像启动容器。
通过以上步骤,你的 Docker 容器将运行一个 HTTP 服务,能够共享并提供物理机 /opt/share 目录下的文件。你可以通过访问 http://<your-host-ip>:8000 来查看和下载这些文件。
镜像构建失败的原因
镜像构建失败:
检查Dockerfile中的指令是否正确。
确保所有依赖文件都已正确复制到容器中。
容器无法启动:
检查应用程序的启动脚本是否有错误。
确保端口映射正确。
镜像体积过大:
使用多阶段构建优化镜像大小。
清理不必要的文件和依赖。
评论区