一、Dockerfile的构建
1、指定镜像
采用FROM指令:
FROM 指定镜像名称
2、设置标签信息
对镜像进行备注说明:
LABEL manager="admin" \
label1="docker build1" \
lable2="docker build2"
3、运行命令
容器运行后,执行的指令
RUN echo "docker build run."
4、容器启动指令
CMD sleep 6;echo start success
5、Dockerfile 的编写示例
# Dockerfile使用的镜像
FROM alpine
#镜像标签配置
LABEL manager="admin" \
label1="docker build1" \
lable2="docker build2"
#运行的指令
RUN echo "docker build run."
#容器启动后的执行命令
CMD sleep 6;echo start success
Dockerfile 主要分为四部分: 镜像信息 、维护信息、操作指令、启动时执行指令。
CMD与ENTRYPOINT的差异
1. CMD指令指定的容器启动时命令可以被docker run指定的命令覆盖,而ENTRYPOINT指令指定的命令不能被覆盖,而是将docker run指定的参数当做ENTRYPOINT指定命令的参数;
例:
CMD ["ls","-a"]
docker run xxx -l 会替换为 -l 执行, 会报错。
2. CMD指令可以为ENTRYPOINT指令设置默认参数,而且可以被docker run指定的参数覆盖;
例:
ENTRYPOINT ["ls","-a"]
docker run xxx -l 会拼接为 ls -al执行。
如果运行JAVA程序, 增加ENTRYPOINT:
ENTRYPOINT [ "sh", "-c", "java -Djava.security.egd=file:/dev/./urandom
$JAVA_OPTS -jar /app.jar $PARAMS" ]
# 运行命令 docker run -e JAVA_OPTS="-Xmx512m -Xms33 -" -e PARAMS="--
spring.profiles=dev --server.port=8080" -jar /app/app.jar
6、运行容器
docker run --name test1 -it dockerfile:test1
7、镜像的存储
查看镜像信息:
docker image inspect my-wizard:0.1
存储目录结构:
"GraphDriver": {
"Data": {
"LowerDir": "/var/lib/docker/overlay2/b7e19d896235074801e65678900f1eb9e3d42a15961e1c5776e821a48c508602/diff:/var/lib/docker/overlay2/94c244b15f5d5290dc48ea41fe90e30292169c1ad1316b4b4508a26043a03889/diff:/var/lib/docker/overlay2/51e4f5054f8035f78df429174458d3511c75086bacd9bc22727ba3b4bdf1ee17/diff:/var/lib/docker/overlay2/fe000be05464f9548d95b24c0773ec5fbefd9f18bc6b393d2fe2731e9bd5b929/diff:/var/lib/docker/overlay2/d257f693e8aa47470bb2a0ea82fcc833d5560e3b471cb008b8d00ff29979e90c/diff:/var/lib/docker/overlay2/3648999483d13c18d34f00d90d843b3aca2abfdc946180730593fecb8585c673/diff:/var/lib/docker/overlay2/3f469b0f602b3f8bf2d85a867652cb045c86bb44da93599a440c6af66c8c4702/diff:/var/lib/docker/overlay2/74114f4a8911f8bee5a793d16b9e66417033aaa3b2763920fd4e7203f2a83aeb/diff:/var/lib/docker/overlay2/7fe7e08fc852d57d1cdf3d8ffce3969da42af3f7c82f01b06501364f86cd615c/diff:/var/lib/docker/overlay2/b59d29226dd54f956383976ee17c2098e351fe73ec27794e35740a4af0467a19/diff:/var/lib/docker/overlay2/83054ea9dfefb4e0f666a640f82476be7b6ee2f0e050b9afc486a7eef755a0f1/diff:/var/lib/docker/overlay2/298e882043803bbafefbbcdd98cdc78df14f4bfa789867be918c60291d1b2ba4/diff:/var/lib/docker/overlay2/2eed01572ca6f1212afceff327c71b4d6bb92033b17ce7ec1476d72afed7b194/diff:/var/lib/docker/overlay2/3284164b93f7945defcbb61bb7eb0d78989b69acd0f20acb2a04b3ac9f6478f1/diff:/var/lib/docker/overlay2/2927eeb30fe0e11cb65dd08a196b9f63e9fd5f6e689aa2e71c58be47d043bef9/diff:/var/lib/docker/overlay2/92a64758e128809c3d6a5ce4bda56f231d969c9915cdc6891031dfaa13c5bf40/diff:/var/lib/docker/overlay2/ad0138bb13e3a6549a967a03be1338680fa79d65f77df0a24e3e3905fa31bb49/diff:/var/lib/docker/overlay2/3dd833c5349e77df38958ab59080311227c84dffd9e85d476d137ad5404a8417/diff:/var/lib/docker/overlay2/19b0730a578cbdf1bde44a7c0296c6dcff39d46154435370231e0b090f2989f8/diff:/var/lib/docker/overlay2/a4b2e0843b03de43dec536f958cb46072c8b5f33bc4cc2429eb92e098d6c3869/diff:/var/lib/docker/overlay2/e659df56cceb80589bfd6d68df3ef703773450158f4f682f5c2b3ac05308264d/diff:/var/lib/docker/overlay2/2e950590bd3aff9d24c436e45a8f53afbc6a5dec7c3cf86223473fa6953dffda/diff:/var/lib/docker/overlay2/f82ab6a6e0611a78a95611d281245b2c2edfaa273d29d88de989b081f79651bb/diff:/var/lib/docker/overlay2/c0c628c8cdf5641f1642eff0f42a5f12ab178cb596e6bce7a86efe725a7da333/diff:/var/lib/docker/overlay2/1041b58a07cfbf956c4a2a2ff2adc93ef1e3f85813dab0bac069452837c5f9fa/diff:/var/lib/docker/overlay2/0247958590c10ef1c20789c2131413b668357348af09955ac8f118b8723d7f5f/diff:/var/lib/docker/overlay2/a8896150c3e359092e2e6d62b755c440e13ee4f8db990135800e0ef46d7894c1/diff",
"MergedDir": "/var/lib/docker/overlay2/66e9b11cf699cbdc26eac8dfd363274ac0cf601804ae79999c31265899204d4a/merged",
"UpperDir": "/var/lib/docker/overlay2/66e9b11cf699cbdc26eac8dfd363274ac0cf601804ae79999c31265899204d4a/diff",
"WorkDir": "/var/lib/docker/overlay2/66e9b11cf699cbdc26eac8dfd363274ac0cf601804ae79999c31265899204d4a/work"
},
"Name": "overlay2"
},
二、Docker Compose的使用
1、安装Docker Compose
进入https://github.com/docker/compose/releases检索docker引擎所对应的版本:
2、执行安装:
curl -SL https://github.com/docker/compose/releases/download/1.29.0/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
3、创建一个python应用脚本
app.py
import time
import redis
from flask import Flask
app = Flask(__name__)
cache = redis.Redis(host='redis', port=6379)
def get_hit_count():
retries = 5
while True:
try:
return cache.incr('hits')
except redis.exceptions.ConnectionError as exc:
if retries == 0:
raise exc
retries -= 1
time.sleep(0.5)
@app.route('/')
def hello():
count = get_hit_count()
return 'Hello World! I have been seen {} times.\n'.format(count)
创建依赖信息文件:
requirements.txt
flask
redis
4、创建Dockerfile文件
# syntax=docker/dockerfile:1
FROM python:3.7-alpine
WORKDIR /code
ENV FLASK_APP=app.py
ENV FLASK_RUN_HOST=0.0.0.0
RUN apk add --no-cache gcc musl-dev linux-headers
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt
EXPOSE 5000
COPY . .
CMD ["flask", "run"]
5、执行构建
创建名称为web的镜像
docker build -t web .
6、创建docker-compose配置文件
version: "3.9" #指定版本号;查看文档https://docs.docker.com/compose/compose-file/
services: #所有需要启动的服务
web: #第一个服务的名字
build: # 可手动执行创建镜像: docker build -t xxx -f Dockerfile .
dockerfile: Dockerfile
context: .
image: 'hello:py'
ports: #指定启动容器暴露的端口
- "5000:5000"
redis: #第二个服务的名字
image: "redis:alpine"
7、启动执行:
通过命令启动: docker-compose up
加上-d参数, 以后台方式启动。
[root@localhost composetest]# docker-compose up
Starting composetest_web_1 ... done
Starting composetest_redis_1 ... done
Attaching to composetest_redis_1, composetest_web_1
redis_1 | 1:C 04 Nov 2022 17:19:23.281 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
redis_1 | 1:C 04 Nov 2022 17:19:23.281 # Redis version=7.0.5, bits=64, commit=00000000, modified=0, pid=1, just started
redis_1 | 1:C 04 Nov 2022 17:19:23.281 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
redis_1 | 1:M 04 Nov 2022 17:19:23.281 * monotonic clock: POSIX clock_gettime
redis_1 | 1:M 04 Nov 2022 17:19:23.282 * Running mode=standalone, port=6379.
redis_1 | 1:M 04 Nov 2022 17:19:23.282 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
redis_1 | 1:M 04 Nov 2022 17:19:23.282 # Server initialized
redis_1 | 1:M 04 Nov 2022 17:19:23.282 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
redis_1 | 1:M 04 Nov 2022 17:19:23.282 * Loading RDB produced by version 7.0.5
redis_1 | 1:M 04 Nov 2022 17:19:23.282 * RDB age 605 seconds
redis_1 | 1:M 04 Nov 2022 17:19:23.282 * RDB memory usage when created 0.82 Mb
redis_1 | 1:M 04 Nov 2022 17:19:23.282 * Done loading RDB, keys loaded: 1, keys expired: 0.
redis_1 | 1:M 04 Nov 2022 17:19:23.282 * DB loaded from disk: 0.000 seconds
redis_1 | 1:M 04 Nov 2022 17:19:23.282 * Ready to accept connections
web_1 | * Serving Flask app 'app.py'
web_1 | * Debug mode: off
web_1 | WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
web_1 | * Running on all addresses (0.0.0.0)
web_1 | * Running on http://127.0.0.1:5000
web_1 | * Running on http://172.18.0.3:5000
web_1 | Press CTRL+C to quit
8、验证访问:
[root@localhost bin]# curl http://127.0.0.1:5000
Hello World! I have been seen 4 times.
[root@localhost bin]# curl http://172.18.0.3:5000
Hello World! I have been seen 5 times.
9、停止服务
[root@localhost composetest]# docker-compose stop redis
Stopping composetest_redis_1 ... done
[root@localhost composetest]# docker-compose stop web
Stopping composetest_web_1 ... done
这里的服务名字与docker-compose配置文件中的名称对应。
三、Docker Swarm集群模式
1、创建Dockerfile
创建一个需要采用集群模式部署的Dockerfile:
version: "3.7"
services:
app: #定义应用程序的容器
image: node:12-alpine
command: sh -c "yarn install && yarn run dev"
ports:
- 3000:3000
working_dir: /app
volumes:
- ./:/app
environment:
MYSQL_HOST: mysql
MYSQL_USER: root
MYSQL_PASSWORD: secret
MYSQL_DB: todos
networks: # 加入application和databases两个网络
- application
- databases
deploy: #安装docker swarm
replicas: 6 #指定副本:部署到加入swarm集群的不同的节点(负载均衡+高可用)
mysql: # 定义mysql数据库的容器
image: mysql:5.7
volumes:
- mysql-data:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: secret
MYSQL_DATABASE: todos
networks: #这个服务加入hello自定义网络
- databases
deploy: #安装docker swarm
replicas: 6 #指定副本:处于不同的服务器(负载均衡+高可用)
redis: # 定义redis缓存的容器
image: redis
networks:
- application
# 定义全局的配置信息,包括volumes与networks
volumes:
mysql-data:
networks:
application:
databases:
2、集群初始化
主节点进行初始化:
[root@localhost ~]# docker swarm init
Swarm initialized: current node (oyje6kmyqnot8fop89msrs1wf) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-1iq2u7f21fty2wyih2xh6j8jzb87uiwi2gpqclg77ykii642kz-bupmi5rixs4a7zaho7i8o8kjf 10.10.20.15:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
[root@localhost ~]#
其他节点加入执行:
docker swarm join --token SWMTKN-1-1iq2u7f21fty2wyih2xh6j8jzb87uiwi2gpqclg77ykii642kz-bupmi5rixs4a7zaho7i8o8kjf 10.10.20.15:2377
3、多个主节点的加入配置(高可用)
在集群主节点执行:
[root@localhost ~]# docker swarm join-token manager
To add a manager to this swarm, run the following command:
docker swarm join --token SWMTKN-1-1iq2u7f21fty2wyih2xh6j8jzb87uiwi2gpqclg77ykii642kz-1dturcr1g93eak84d2jlvfbop 10.10.20.15:2377
在其他集群主节点执行
docker swarm join --token SWMTKN-1-1iq2u7f21fty2wyih2xh6j8jzb87uiwi2gpqclg77ykii642kz-1dturcr1g93eak84d2jlvfbop 10.10.20.15:2377