DockerDocker 相关
Spark 一、Docker 安装
1. Ubuntu & Debian
1 2
| curl -fsSL https://get.docker.com -o get-docker.sh sudo sh get-docker.sh
|
2. CentOS
1
| curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
|
二、配置镜像源或网络代理
1. 配置镜像源
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| vim /etc/docker/daemon.json
{ "registry-mirrors": ["https://docker.aspark.cc"] }
:wq
systemctl daemon-reload
systemctl restart docker
|
2. Docker Pull 代理
执行 docker pull 时,操作实际上由 Docker 守护进程 (dockerd) 完成。因此,代理设置需要应用到 dockerd 的运行环境中,而 dockerd 的运行环境是由 systemd 管控的,所以需要在 systemd 中进行配置。
1 2
| sudo mkdir -p /etc/systemd/system/docker.service.d sudo touch /etc/systemd/system/docker.service.d/proxy.conf
|
在这个proxy.conf文件(可以是任意***.conf**的形式)中,添加以下内容:
1 2 3 4
| [Service] Environment="HTTP_PROXY=http://proxy.example.com:10809/" Environment="HTTPS_PROXY=http://proxy.example.com:10809/" Environment="NO_PROXY=localhost,127.0.0.1,.example.com"
|
配置完成后,使用以下命令重启
1 2
| sudo systemctl daemon-reload sudo systemctl restart docker
|
3. Container 代理
在容器运行阶段,如果需要代理上网,则需要配置 ~/.docker/config.json。以下配置,只在 Docker17.07 及以上版本生效。
1 2 3 4 5 6 7 8 9 10 11
| { "proxies": { "default": { "httpProxy": "http://proxy.example.com:10809", "httpsProxy": "http://proxy.example.com:10809", "noProxy": "localhost,127.0.0.1,.example.com" } } }
|
配置完成后,使用以下命令重启
1
| sudo systemctl restart docker
|
以上是用户级的配置,除了 proxies,docker login 等相关信息也会在其中,而且还可以配置信息展示的格式、插件参数等。
此外,容器的网络代理,也可以直接在其运行时通过 -e 注入 http_proxy 等环境变量,如下:
1 2 3 4
| docker run \ -e http_proxy=http://proxy.example.com:8080 \ -e https_proxy=http://proxy.example.com:8080 \ my-container
|
4. Docker Build 代理
虽然 docker build 的本质,也是启动一个容器,但是环境会略有不同,用户级配置无效。在构建时,需要注入 http_proxy 等参数。
1 2 3 4 5
| docker build . \ --build-arg "HTTP_PROXY=http://proxy.example.com:10809/" \ --build-arg "HTTPS_PROXY=http://proxy.example.com:10809/" \ --build-arg "NO_PROXY=localhost,127.0.0.1,.example.com" \ -t your/image:tag
|
注意:无论是 docker run 还是 docker build,默认是网络隔绝的。如果代理使用的是 localhost:10809 这类,则会无效。这类仅限本地的代理,必须加上 –network host 才能正常使用。而一般则需要配置代理的外部IP,而且代理本身要开启 Gateway 模式。
三、Docker 常用命令
① docker run 命令
docker run 用于创建并启动容器,以下是常用参数说明:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| docker run -d \ --name container-name --network network-name --restart policy --cpus 1.5 --memory 512m --memory-swap 1g --privileged --device /dev/sda:/dev/sda --dns 8.8.8.8 -p host-port:container-port -v ./host/path:/container/path -v volume-name:/container/path -e VARIABLE=value image-name[:tag]
|
其中 –restart 有以下策略:
策略 | 说明 |
---|
no | 默认策略,容器退出时不重启 |
unless-stopped | 总是重启容器,但如果容器之前被手动停止,则在 Docker 服务重启时不会启动容器 |
always | 总是重启容器,即使容器被手动停止,在 Docker 服务重启时也会启动容器 |
on-failure[:max-retries] | 仅在容器以非零状态码退出时重启,可以指定最大重试次数 |
unless-stopped 和 always 的区别是在手动停止(docker stop container-name/container-id) 后,always 会在 docker 守护进程或主机重启时,自动重启容器,而 unless-stopped 不会;在非手动重启时,两者效果一样。
② 容器生命周期管理
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| docker start container-name
docker stop container-name
docker restart container-name
docker pause container-name
docker unpause container-name
docker rm container-name
docker rm -f container-name
|
③ 容器状态查看
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| docker ps
docker ps -a
docker logs container-name docker logs -f container-name docker logs -n 100 container-name docker logs --since 2024-01-01 container-name
docker inspect container-name
docker stats
docker top container-name
|
④ 镜像管理
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| docker search image-name
docker pull image-name[:tag]
docker images
docker rmi image-name[:tag]
docker build -t image-name[:tag] .
docker push image-name[:tag]
docker save -o filename.tar image-name[:tag]
docker load -i filename.tar
|
⑤ 网络管理
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| docker network create network-name
docker network ls
docker network inspect network-name
docker network connect network-name container-name
docker network disconnect network-name container-name
docker network rm network-name
|
⑥ 数据卷管理
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| docker volume create volume-name
docker volume ls
docker volume inspect volume-name
docker volume rm volume-name
docker volume prune
|
⑦ 系统维护
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| docker info
docker version
docker system df
docker system prune docker system prune -a
docker events
docker login [registry-url]
docker logout [registry-url]
|
四、Docker Compose
1. 常用命令
① 启动服务
1 2 3 4 5 6 7 8 9 10 11
| docker compose up
docker compose up -d
docker compose up <service_name>
docker compose up --scale <service_name>=<service_num>
|
② 停止服务
1 2 3 4 5 6 7 8
| docker compose down
docker compose stop
docker compose stop <service_name>
|
③ 构建服务
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| docker compose build
docker compose build <service_name>
docker compose build --no-cache docker compose build
docker compose build <service_name>
docker compose build --no-cache
|
④ 查看状态
1 2 3 4 5 6 7 8 9 10 11
| docker compose ps
docker compose logs
docker compose logs -f
docker compose logs <service_name>
|
⑤ 管理容器
1 2 3 4 5 6 7 8 9 10 11
| docker compose restart
docker compose restart <service_name>
docker compose pause
docker compose unpause
|
⑥ 执行命令
1 2 3 4 5
| docker compose exec <service_name> <command>
docker compose run <service_name> <command>
|
⑦ 配置相关
1 2 3 4 5
| docker compose config
docker compose ps --services
|
⑧ 一些实用的组合命令
1 2 3 4 5 6 7 8
| docker compose down && docker compose build --no-cache && docker compose up -d
docker compose top
docker compose up -d --force-recreate
|
2. docker-compose.yml 模板
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146
| version: '3.8'
services: webapp: build: context: ./path/to/build/context dockerfile: Dockerfile args: BUILD_ENV: production image: nginx:latest container_name: my-webapp hostname: webapp-host restart: unless-stopped environment: - NODE_ENV=production - API_KEY=xxx env_file: - .env
ports: - "80:80" - "443:443" - "3000-3010:3000-3010" volumes: - ./app:/usr/src/app - data-volume:/data - /tmp:/tmp:ro depends_on: - redis - postgres healthcheck: test: ["CMD", "curl", "-f", "http://localhost"] interval: 30s timeout: 10s retries: 3 start_period: 40s
deploy: resources: limits: cpus: '0.50' memory: 512M reservations: cpus: '0.25' memory: 256M networks: - frontend - backend logging: driver: "json-file" options: max-size: "200k" max-file: "10"
redis: image: redis:alpine command: redis-server --appendonly yes volumes: - redis-data:/data
postgres: image: postgres:13 environment: POSTGRES_USER: user POSTGRES_PASSWORD: password POSTGRES_DB: mydb volumes: - postgres-data:/var/lib/postgresql/data entrypoint: docker-entrypoint.sh postgres user: postgres
volumes: data-volume: driver: local redis-data: driver: local postgres-data: driver: local driver_opts: type: none device: /path/on/host o: bind
networks: frontend: driver: bridge ipam: driver: default config: - subnet: 172.16.238.0/24 backend: driver: bridge enable_ipv6: true external: true name: existing-network
configs: http_config: file: ./httpd.conf
secrets: server_certificate: file: ./server.cert
x-custom: foo: bar
|