- 编码和测试
- 如何配置环境?
- 按步骤配置
- 是否可以更好地配置?
- 部署代码到测试环境
- 解决“在我这里工作”问题
- 部署代码到生产环境
- 预发布和生产环境差异
通过打包代码和所有配置,构建一次,在本地、预发布和生产环境中运行,尽量保持环境一致。
Docker 是一种 PaaS 产品,使用操作系统级别的虚拟化技术,将软件打包成独立的容器,这些容器可以在任何地方运行。
- Docker 是一套 PaaS 产品,使用操作系统级别的虚拟化技术,将软件打包成独立的容器。
- 容器是彼此隔离的,包含自己的软件、库和配置文件。
- 资源利用:一台电脑上运行多个服务。
- 隔离:多个服务同时使用需要隔离环境,防止资源冲突。
- 资源限制:控制 CPU、内存等资源使用。
Docker 使开发人员能够轻松地打包、传输和运行任何应用程序,将其作为轻量级、可移植、自给自足的容器,可以在几乎任何地方运行。
- 容器和虚拟机都将物理机器隔离成多个虚拟机器。
- 区别在于实现方式和层级:虚拟机虚拟化物理硬件,容器在操作系统上隔离出不同的环境。
- 可移植性:容器可以在不同环境中一致运行。
- 应用中心化:专注于应用的部署,而不是底层机器的配置。
- 自动构建:开发人员可以自动化地从源代码构建容器。
- 版本控制:类似于 Git 的版本控制功能,可以追踪容器的不同版本。
- 组件重用:任何容器都可以作为基础镜像,创建更多专用组件。
- 共享:通过 Docker Hub 分享和获取有用的镜像。
镜像包含运行容器所需的所有文件和配置信息。构建一次镜像,可以多次启动容器。
- Docker Daemon
- 客户端
- CLI
- GUI
- 容器
- 镜像
- 资源
- 网络
- 数据卷
CLI 是与 Docker Daemon 交互的命令行界面,极大简化了容器管理。
-
运行 Docker 容器
docker run -d -p 80:80 --name demo nginxdemos/hello
-d:后台运行-p:端口映射--name:容器命名
-
列出 Docker 容器
docker ps
-
列出 Docker 镜像
docker images
-
查看容器日志
docker logs -f demo
-
检查容器
docker inspect demo
-
复制文件到容器
docker cp your_file demo:/
-
进入容器并执行命令
docker exec -it demo sh -
停止或杀死容器
docker stop demo docker kill demo -
查看所有容器
docker ps -a
-
删除容器
docker rm demo
-
在不同端口运行相同容器
docker run -p 8080:80 --name demo8080 nginxdemos/hello
使用 Dockerfile 创建自定义镜像。
参考链接: console-helloworld
./run.sh分步操作:
-
构建镜像
cd 1.console-helloworld docker build -t jr/console-helloworld . docker images
-
运行镜像
docker run --rm jr/console-helloworld
Dockerfile:
FROM ubuntu
ENTRYPOINT ["/bin/bash"]
CMD ["-c", "echo Hello world from command line."]run.sh:
#!/bin/bash
set -e
cd "$(dirname "$0")"
echo "Building image ..."
docker build -t jr/console-helloworld .
echo
echo "Running container ..."
docker run --rm jr/console-helloworldFROM python:3
WORKDIR /usr/src/app
COPY . .
RUN pip install --no-cache-dir -r ./src/requirements.txt
EXPOSE 5000
CMD ["python", "./src/app.py"]参考链接: web-nginx
cd 2.web-nginx
docker build -t jr/web-helloworld .
docker imagesDockerfile:
FROM nginx
COPY ./index.html /usr/share/nginx/html参考链接: web-python-flask
cd 3.web-python-flask
docker build -t jr/web-flask .
docker imagesDockerfile:
FROM tiangolo/uwsgi-nginx-flask:python3.7
RUN pip install requests
COPY ./app /app参考链接: console-dependency
Dockerfile:
FROM ubuntu
RUN apt-get update && apt-get install -y curl && apt-get autoclean
COPY app/main.sh .
ENTRYPOINT ["/bin/bash"]
CMD ["main.sh"]main.sh:
#!/bin/bash
echo "Press Ctrl+C any time to stop the application."
echo
for i in $(seq 2); do
for key in sy au ing ba lu pa ji san; do
echo "Searching all cities that contains '${key}' keyword ..."
curl http://citymatcher?city=${key} 2>/dev
/null
echo
echo
sleep 3
done
done构建与运行:
cd 4.console-dependency
docker build -t jr/console-hello .
docker images
docker run --link webflask --rm jr/console-hellodocker kill $(docker ps -q)使用 Docker Compose 同时启动多个容器。
参考链接: docker-compose
docker-compose.yml:
version: "3"
services:
console-helloworld:
image: jr/console-helloworld
build: ../dockerfile/1.console-helloworld
web-nginx:
image: jr/web-helloworld
build: ../dockerfile/2.web-nginx
ports:
- "8080:80"
web-python-flask:
image: jr/web-citymatcher
build: ../dockerfile/3.web-python-flask
ports:
- "80:80"
console-dependency:
image: jr/console-citymatcher
build: ../dockerfile/4.console-dependency
links:
- web-python-flask:citymatcher
depends_on:
- web-python-flask启动 Compose:
docker-compose upDocker Hub 账户上可以推送自己的镜像。
参考链接: docker-registry
docker pull myimage:1.0
docker tag myimage:1.0 myrepo/myimage:2.0
docker push myrepo/myimage:2.0- 不安全的主机
- 含有漏洞的镜像
- 镜像中暴露秘密
- 容器逃逸漏洞
- 官方 Docker 镜像
- 使用工具扫描已知漏洞(如 Docker Scout)
docker scout quickview jr/web-flask:latest
- Docker 官方文档
- Docker Compose 文件
- Docker Compose FAQ
- Dockerfile 最佳实践
- Dockerfile 教程
- CI/CD 与 GitHub Actions
通过实际操作练习不同的 Docker 命令,熟悉 Docker CLI 的使用。
- 确保 Docker 已启动。
- 熟练使用 Linux 命令,如
ls、cd、copy。 - 掌握以下命令:
buildrun(可加rm参数)stop
FROM python:3
WORKDIR /usr/src/app
COPY . .
RUN pip install --no-cache-dir -r ./src/requirements.txt
EXPOSE 5000
CMD ["python", "./src/app.py"]通过编写和执行 Dockerfile,理解其工作原理。
- 编写简单的 Dockerfile,并使用
docker build构建镜像。 - 使用
docker run运行容器。
FROM ubuntu
ENTRYPOINT ["/bin/bash"]
CMD ["-c", "echo Hello world from command line."]使用 Docker Compose 配置多容器应用。
version: "3"
services:
console-helloworld:
image: jr/console-helloworld
build: ../dockerfile/1.console-helloworld
web-nginx:
image: jr/web-helloworld
build: ../dockerfile/2.web-nginx
ports:
- "8080:80"
web-python-flask:
image: jr/web-citymatcher
build: ../dockerfile/3.web-python-flask
ports:
- "80:80"
console-dependency:
image: jr/console-citymatcher
build: ../dockerfile/4.console-dependency
links:
- web-python-flask:citymatcher
depends_on:
- web-python-flask启动 Compose:
docker-compose up