目标,一键deploy 开启服务.
1 技术准备,学习compose.
1.1 机器准备,docker 安装。
docker 已安装
卸载其它已有服务 (例如之前的宝塔bt)
1.2 阅读学习docker compose 官方文档
- 使用 Dockerfile 定义应用程序的环境。
- 使用 docker-compose.yml 定义构成应用程序的服务,这样它们可以在隔离环境中一起运行。
- 最后,执行 docker-compose up 命令来启动并运行整个应用程序。
1.3 发现要安装docker-compose
curl -L https://get.daocloud.io/docker/compose/releases/download/v2.4.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
#测试是否安装成功:
docker-compose version
第一个坑
docker-compose version
/usr/local/bin/docker-compose: line 1: html: No such file or directory
/usr/local/bin/docker-compose: line 2: syntax error near unexpected token `<'
'usr/local/bin/docker-compose: line 2: `<head><title>502 Bad Gateway</title></head>
[root@ecs-c6s-xlarge-2-linux-20200928152524 tmp]# cd /usr/local/bin/
定位为 docker-compose 文件下载失败,删掉重新下载。
再次下载,发现还是无法下载,换源安装 。
docs.docker.com/compose/ 网卡,换vpn.
选择场景3 install standalone docs.docker.com/compose/ins…
#52M,慢慢下。
curl -SL https://github.com/docker/compose/releases/download/v2.18.1/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose
大约一个半小时,
借公司服务器下载。
scp -i /.ssh/latipay-staging.pem root@xxx:/usr/local/bin/docker-compose ./
#再来一次,
chmod +x /usr/local/bin/docker-compose
ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
#测试是否安装成功:
docker-compose version
//安装成功。
Docker Compose version v2.18.1
1.4 compose 的第一个例子。
docs.docker.com/compose/get… 官网例子。
Step 1: Define the application dependencies
-
Create a directory for the project:
$ mkdir composetest $ cd composetest -
Create a file called
app.pyin your project directory and paste the following code in: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 -
Create another file called
requirements.txtin your project directory and paste the following code in:flask redis
Step 2: Create a 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"]
docker-compose up
第二个坑,还是网络问题。
error pulling image configuration: download failed after attempts=6: dial tcp 104.18.125.25:443: i/o timeout
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://6c3kptqz.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
下载镜像时为飞速 ,but 又来一坑。
=> ERROR [web 3/6] RUN apk add --no-cache gcc musl-dev linux-headers
> [web 3/6] RUN apk add --no-cache gcc musl-dev linux-headers:
#0 0.155 fetch https://dl-cdn.alpinelinux.org/alpine/v3.15/main/x86_64/APKINDEX.tar.gz
#0 1.156 fetch https://dl-cdn.alpinelinux.org/alpine/v3.15/community/x86_64/APKINDEX.tar.gz
#0 1.156 WARNING: Ignoring https://dl-cdn.alpinelinux.org/alpine/v3.15/main: temporary error (try again later)
#0 2.158 WARNING: Ignoring https://dl-cdn.alpinelinux.org/alpine/v3.15/community: temporary error (try again later)
#0 2.158 ERROR: unable to select packages:
#0 2.159 gcc (no such package):
#0 2.159 required by: world[gcc]
#0 2.159 linux-headers (no such package):
#0 2.159 required by: world[linux-headers]
#0 2.159 musl-dev (no such package):
#0 2.159 required by: world[musl-dev]
------
failed to solve: process "/bin/sh -c apk add --no-cache gcc musl-dev linux-headers" did not complete successfully: exit code: 3
搜索后发现。 stackoverflow.com/questions/6…
没必要深入,拒绝时间花在排这个坑上,切换一个自己玩的nginx 即可。
1.5 compose 例子 nginx 服务 。
vim docker-compose.yaml
version: "3"
services:
nginx:
image: nginx
ports:
- 80:80
volumes:
- ~/cert:/home/cert # HTTPS证书目录挂载到容器的home目录下
- ~/www:/home/www # 挂载宿主机上的www目录到容器里的home目录下方便发布web项目
- ./nginx.conf:/etc/nginx/nginx.conf
- ./conf.d/:/etc/nginx/conf.d/
- ./logs:/var/log/nginx # 把容器内的Nginx日志目录挂载到宿主机
- /etc/localtime:/etc/localtime:ro #配置容器时间同步
restart: always
container_name: ng
vim nginx.conf
user nginx;
worker_processes 2;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
gzip_disable "MSIE [1-6]\.";
include /etc/nginx/conf.d/*.conf;
sendfile on;
}
echo "hello world docker-compose demo" > /home/www/index.html
碰到坑 403
2023/06/17 00:15:40 [error] 53#53: *5 open() "/home/www/index.html" failed (13: Permission denied), client: 127.0.0.1, server: , request: "GET /index.html HTTP/1.1", host: "127.0.0.1
将nginx.conf 用户更改为 root ,再重新compose 就好了。
docker-compose down
docker-compose up
curl -X GET http://locahost
//成功
hello world docker-compose demo