docker-compose 实战学习笔记 一

1,317 阅读3分钟

目标,一键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.

docs.docker.com/compose/ins…

选择场景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

  1. Create a directory for the project:

    $ mkdir composetest
    $ cd composetest
    
  2. Create a file called app.py in 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
    
  3. Create another file called requirements.txt in 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