Docker 作为一种开源的容器化技术,在当今的软件开发和部署领域中发挥着至关重要的作用。它具有诸多显著优势,为开发者和运维人员带来了极大的便利。
首先,Docker 具有轻量级的特点。与传统的虚拟机相比,Docker 容器不需要运行完整的操作系统,只包含应用程序及其所需的依赖项,因此占用的资源更少,启动和停止速度更快。例如,Docker 容器可以在几秒钟内启动,而虚拟机可能需要几分钟甚至更长时间。
其次,可移植性是 Docker 的另一大优势。Docker 容器可以在任何支持 Docker 的平台上运行,无论是物理机、虚拟机还是云环境。这使得开发者可以在本地开发、测试应用程序,然后轻松地将其部署到不同的环境中,而无需担心环境差异导致的问题。
一致性也是 Docker 的重要特点之一。通过使用 Docker 镜像,开发者可以确保在不同的环境中运行的应用程序具有相同的配置和依赖项。这有助于减少因环境不一致而导致的问题,提高开发和部署的效率。
此外,Docker 还提供了良好的隔离性。每个 Docker 容器都在独立的进程中运行,相互之间不会干扰。这有助于确保应用程序的稳定性和安全性,同时也便于进行资源管理和分配。
总之,Docker 容器化部署技术凭借其轻量级、可移植、一致性和隔离性等优势,为开发者和运维人员提供了一种高效、可靠的应用程序部署方式。
Windows 系统安装步骤:
macOS 系统安装步骤:
可以使用 Homebrew 来安装 Docker。Homebrew 的 Cask 已经支持 Docker for Mac,因此可以很方便的使用 Homebrew Cask 来进行安装:输入命令:brew cask install docker。安装过程中,最终出现 docker was successfully installed!提示语时表示 docker 安装成功,最后在启动台里可以看到下载好的 docker.app。
Linux 系统安装步骤:
以 Centos7 为例:
设置存储位置:
设置环境变量:
调整启动参数:
例如,启动一个 nginx 容器,并将 80 端口映射到主机的 8080 端口:docker run -d -p 8080:80 --name my-nginx-container nginx。
搜索镜像:可以使用docker search命令从镜像仓库中查找所需镜像。例如,要查找所有包含“hello-world”的镜像,可以执行docker search hello-world。如果要查找收藏数大于 10 的包含“hello-world”的镜像,可以使用docker search -s 10 hello-world。
拉取镜像:使用docker pull命令可以从镜像仓库中拉取镜像。默认情况下,拉取的是最新版本的镜像,如docker pull hello-world就是拉取REPOSITORY为“hello-world”的最新镜像。如果要拉取特定版本,可以加上版本号,如docker pull hello-world:7.4。同时,也可以使用docker pull -a hello-world拉取“hello-world”的所有镜像。
查看镜像:docker images命令可以列出本地所有的非隐藏镜像。它有很多参数可以使用,比如-a参数可以列出本地所有的镜像(含中间映像层);--digests参数显示镜像的摘要信息;--format参数可以指定返回值的模板文件;--no-trunc参数显示完整的镜像信息;-q只显示镜像 ID。
删除镜像:使用docker rmi命令可以删除本地没有被容器占用的镜像。如果要强制删除,可以加上-f参数,但需注意如果镜像关联了容器,强制删除可能会导致数据丢失或不一致。例如,docker rmi image_name/image_id删除本地没有被容器占用的镜像,docker rmi image_name/image_id -f强制删除本地镜像。
构建镜像:可以通过 Dockerfile 构建镜像,使用docker build -f Dockerfile的文件路径 -t 新镜像名字:TAG.命令。在当前目录下,如果不指定-f参数,默认读取名字为 Dockerfile 的文件,-t选项用于给构建的镜像标记名称和标签。
运行容器:使用docker run命令可以启动一个新的容器。这个命令有很多参数,比如--name可以给容器设置一个名称;-d可以后台运行容器,并返回容器 ID;-i和-t参数一起使用可以以交互模式运行容器,并分配一个伪输入终端;-e可以设置环境变量;-p可以指定端口映射;-v可以挂载一个目录或文件。例如,docker run -d -p 8080:80 --name my-nginx-container nginx启动一个 nginx 容器,并将 80 端口映射到主机的 8080 端口,同时给容器命名为“my-nginx-container”。
查看容器:docker ps命令可以列出当前所有正在运行的容器。-a参数可以列出当前所有正在运行的容器以及历史上运行过的容器;-l显示最近创建的容器;-n显示最近 n 个创建的容器;-q只显示容器编号;--no-trunc不截断输出。
停止容器:使用docker stop命令可以优雅地停止正在运行的容器,允许容器内的应用程序执行清理操作。如果需要立即停止容器,可以使用docker kill命令,但这可能会导致数据丢失或不一致。
启动容器:如果需要启动一个之前停止的容器,可以使用docker start命令。
删除容器:使用docker rm命令可以删除已停止的容器。如果要强制删除正在运行的容器,可以加上-f参数,但需谨慎使用。也可以使用docker rm -f $(docker ps -a -q)或docker ps -a -q | xargs docker rm一次性删除全部已停止的容器。
进入容器终端:有三种方法可以进入 Docker 容器终端。方法一:使用docker exec -it <container_id> <command>命令,其中-it参数表示要进入交互式终端,<container_id>是容器的标识符,<command>是要在容器中执行的命令。方法二:使用docker attach <container_id>命令,可以将当前终端附加到一个正在运行的容器中,但退出时不能使用exit,否则会导致容器停止,可以使用Ctrl + C退出。方法三:使用docker run -it <image_name> <command>命令,可以直接在容器内部启动一个新的终端。
查看容器日志:使用docker logs命令可以查看容器的日志。可以使用-f参数实时跟踪容器的日志输出;--since参数显示自某个 timestamp 之后的日志;--tail参数从日志末尾显示多少行日志;-t参数显示时间戳;--until参数显示自某个 timestamp 之前的日志。例如,docker logs -f -t --since="2018-02-08" --tail=100 CONTAINER_ID查看指定时间后的日志,只显示最后 100 行。
FROM python:3.9WORKDIR /appCOPY. /appRUN pip install -r requirements.txtCMD [\"python\", \"app.py\"]
version: '3'services: web: image: nginx:latest ports: - "80:80"
version: '3'services: web: image: my-web-app:latest ports: - "8080:80" depends_on: - db db: image: mysql:latest environment: MYSQL_ROOT_PASSWORD: password
Flask 是一个用 Python 编写的轻量级 Web 应用框架。以下是使用 Docker 和 Docker Compose 部署 Flask 应用的全过程。
首先,创建一个基本的 Flask 应用。例如,创建一个名为app.py的文件,并写入以下代码:
from flask import Flaskapp = Flask(__name__)@app.route('/')def hello_world(): return 'Hello, World!'if __name__ == '__main__': app.run(host='0.0.0.0', port=8000)
创建一个名为Dockerfile的文件,并写入以下内容:
# 使用官方 Python 运行时作为父镜像FROM python:3.8-slim# 设置工作目录WORKDIR /app# 复制 requirements.txt 到工作目录(先创建这个文件)COPY requirements.txt.# 安装 Gunicorn 和 Flask 应用的依赖RUN pip install --no-cache-dir -r requirements.txt# 复制当前目录下的所有文件到工作目录COPY..# 声明运行时的端口EXPOSE 8000# 运行 Gunicorn 服务器CMD ["gunicorn", "-w", "4", "app:app"]
创建一个requirements.txt文件,列出所有依赖项,例如:
Flask==1.1.2gunicorn==20.0.4
使用以下命令构建 Docker 镜像:
docker build -t my-flask-app.
version: '3'services: flask-app: build:. ports: - "8000:8000"
使用以下命令运行 Docker 容器:
docker-compose up
访问应用在浏览器中访问http://localhost:8000,你应该能看到"Hello, World!"的消息。
以 PHP 应用搭配 Nginx 和 MySQL 为例进行容器化部署和持续集成。
对于 PHP 应用,可以选择官方的php:7.4-fpm镜像作为基础镜像,对于 Nginx 可以选择nginx:latest镜像,对于 MySQL 可以选择mysql:latest镜像。
对于 PHP 应用,创建一个Dockerfile文件如下:
FROM php:7.4-fpm# 设置工作目录WORKDIR /app# 复制 composer.json 和 composer.lock 文件COPY composer.json composer.lock /app/# 安装 Composer 依赖RUN composer install# 复制项目文件COPY. /app/
创建一个nginx.conf文件如下:
worker_processes 1;events { worker_connections 1024;}http { sendfile on; tcp_nodelay on; keepalive_timeout 30; include /etc/nginx/mime.types; default_type application/octet-stream; server { listen 80; server_name localhost; root /usr/share/nginx/html; index index.php index.html; location / { try_files $uri $uri/ =404; } location ~ \\.php$ { fastcgi_pass php:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } }}
version: '3'services: php: build:. volumes: -./app:/app nginx: image: nginx:latest volumes: -./nginx.conf:/etc/nginx/nginx.conf -./app:/usr/share/nginx/html depends_on: - php mysql: image: mysql:latest environment: MYSQL_ROOT_PASSWORD: password
在命令行中进入包含docker-compose.yml文件的目录,执行docker-compose up命令启动应用。
可以使用工具如 Jenkins 或 GitLab CI/CD 进行持续集成。例如,在 GitLab CI/CD 中,可以定义一个.gitlab-ci.yml文件,在代码提交后自动构建镜像、运行测试并部署到生产环境。
以下是一个简单的.gitlab-ci.yml文件示例:
stages: - build - test - deploybuild: stage: build script: - docker-compose buildtest: stage: test script: - docker-compose run --rm php phpunitdeploy: stage: deploy script: - docker-compose push - ssh <server_ip> "docker-compose pull && docker-compose up -d"
通过以上步骤,可以实现 PHP 应用搭配 Nginx 和 MySQL 的容器化部署和持续集成。
在 Docker 容器化部署中,容器通信时配置文件的 IP 地址设置至关重要。Docker 提供了多种网络模式,如 bridge、host、overlay 等。以 bridge 网络模式为例,当创建一个新的 Docker 容器时,可以进入容器内部编辑网络配置文件来设置静态 IP 地址。例如,在大多数 Linux 发行版中,网络配置文件位于 /etc/network/interfaces 路径下。可以添加以下内容来为容器分配特定的 IP 地址:
auto eth0iface eth0 inet staticaddress 192.168.0.100netmask 255.255.255.0gateway 192.168.0.1dns-nameservers 8.8.8.8
这样配置将为容器分配 IP 地址 192.168.0.100,子网掩码 255.255.255.0,网关 192.168.0.1,DNS 服务器 8.8.8.8。保存并退出文件后,需要重新启动网络服务才能使配置生效,可使用 service networking restart 命令。验证 IP 配置是否成功,可以在 Docker 容器中运行 ifconfig 命令,在输出中应该能够看到刚刚配置的静态 IP 地址。
在使用 Kubernetes 进行部署时,应用中通常会涉及到数据库或其他中间件的访问连接,这些连接一般都需要账号、密码等敏感信息。为了确保这些敏感信息的安全,可使用保密字典(Secret)。例如,在 deployment yaml 文件中引入 secret,以数据卷卷方式进行挂载,如下:
apiVersion: apps/v1beta2kind: Deploymentmetadata: name: "${APP_NAME}" labels: app: ${APP_NAME} namespace: your_servicespec: replicas: 1 selector: matchLabels: app: ${APP_NAME} track: stable template: metadata: labels: app: ${APP_NAME} track: stable spec: imagePullSecrets: - name: registry-key containers: - name: ${APP_NAME} image: ${IMAGE_URL} imagePullPolicy: Always resources: {} volumeMounts: - name: volume-your_service-config mountPath: /path/to/config volumes: - name: volume-your_service-config secret: secretName: your-secret-name
Kubernetes 保密字典可用于存储和管理密码、OAuth 令牌和 SSH 保密字典等敏感信息。容器组可以通过三种方式使用保密字典:作为挂载到容器组中容器化应用上的卷中的文件;作为容器组中容器使用的环境变量;作为 kubelet 为容器组拉取镜像时的镜像仓库凭证。
使用官方镜像可以确保镜像的安全性和稳定性。同时,指定特定版本可以避免由于不同版本导致的兼容性问题。例如,要拉取官方的 Nginx 镜像的 1.19.7 版本,可以使用以下命令:docker pull nginx:1.19.7。在 Dockerfile 中指定依赖包的版本也可以确保应用程序的稳定性和一致性。如在构建基于 Node.js 的 Web 应用程序时,可以在 package.json 文件中指定 Express 和 Mongoose 的版本:
{ "name": "myapp", "version": "1.0.0", "dependencies": { "express": "^4.17.1", "mongoose": "^5.12.3" }}
根据绿盟 2018 年 3 月的研究显示,目前 Docker Hub 上的镜像 76%都存在漏洞。因此,进行镜像安全扫描是非常必要的。可以使用工具如 Trivy、Clair 或 Anchore 进行漏洞扫描。例如,使用 Trivy 进行漏洞扫描的命令为:trivy image my-image:latest。为了确保每次构建的镜像都经过漏洞扫描,可以将漏洞扫描集成到持续集成/持续部署(CI/CD)管道中。
使用小型镜像可以加快上线、重启和增加新节点的速度,减少中断服务的时间,同时占用的镜像仓库存储也少。可以选择小的基础镜像如 Alpine Linux 或 Debian 的 slim 版本,或者使用空镜像(FROM scratch)进行构建。例如,使用以下 Dockerfile 可以构建一个小的 Go 语言应用镜像:
FROM golang:alpine AS build-envWORKDIR /appADD. /appENV GOOS=linux GOARCH=amd64 CGO_ENABLED=0RUN cd /app && go build -ldflags -s -a -installsuffix cgo webServer.go && ls -lhFROM scratchWORKDIR /appCOPY --from=build-env /app/webServer /EXPOSE 8080CMD ["/webServer"]
为了进一步优化镜像的大小,可以使用多个 RUN 命令,而不是一个复杂的命令来安装软件包。这样可以减少镜像的历史层,从而减小镜像的大小。例如:
FROM alpine:latest# 安装依赖项RUN apk add --no-cache \\package1 \\package2 \\package3# 清理缓存和临时文件RUN rm -rf /var/cache/apk/* /tmp/*
使用 .dockerignore 文件可以排除不需要的文件和目录,避免将不必要的文件复制到镜像中,从而减小镜像的大小。例如,可以在 .dockerignore 文件中添加以下内容:
node_modules.DS_Store
在容器中运行应用程序时,应该遵循最小权限用户原则,避免使用 root 用户运行应用程序。可以在 Dockerfile 中创建一个新用户,并使用该用户运行应用程序。例如:
FROM ubuntu:latestRUN useradd -m appuserWORKDIR /appCOPY. /appRUN chown -R appuser:appuser /appUSER appuserCMD ["./app"]
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。