docker相关操作

本文最后更新于 2025年4月9日 晚上

1. 安装

  1. 创建一个新的docker用户组,将当前用户添加到docker用户组

    1
    2
    sudo groupadd docker
    sudo usermod -aG docker $USER
  2. 退出当前终端并重新登录以刷新用户组设置。

  3. 检查用户是否已经添加到Docker用户组:

    1
    id -nG
  4. 如果有必要,更新apt软件仓库:

    1
    sudo apt update
  5. 安装Docker的依赖软件包:

    1
    sudo apt-get install -y apt-transport-https ca-certificates curl gnupg-agent software-properties-common
  6. 添加Docker的GPG密钥

    1
    curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
  7. 将Docker软件源添加到Ubuntu 18.04的apt软件仓库

    1
    sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
  8. 再次更新apt软件仓库

    1
    sudo apt update
  9. 安装Docker CE

    1
    sudo apt install docker-ce
  10. 启动Docker服务

    1
    2
    3
    sudo systemctl status docker
    # 或者
    service docker status
  11. 如果Docker服务没有启动,则可以使用以下命令启动:

    1
    2
    3
    sudo systemctl start docker
    # 或者
    service docker start

    现在,非root用户也可以使用Docker了。

  12. 更换国内源

    1
    sudo vim /etc/docker/daemon.json

    在daemon.json中写入以下内容:

    1
    2
    3
    {
    "registry-mirrors": ["http://hub-mirror.c.163.com/"]
    }

    保存退出后重启docker服务:

    1
    sudo service doocker restart

    检查是否生效:

    1
    docker info|grep Mirrors -A 1

2. 创建网络

  1. 创建一个新的网络
    1
    docker network create app-network
  2. 查看网络
    1
    docker network ls
  3. 创建一个公共文件夹
    1
    mkdir -p ~/Docker/public

3.1 手动部署nginx-1.22

  1. 拉取nginx镜像

    1
    docker pull nginx:1.22
  2. 新建文件夹用来存放nginx配置文件

    1
    2
    3
    mkdir -p ~/Docker/nginx/conf
    mkdir -p ~/Docker/nginx/log
    mkdir -p ~/Docker/nginx/html
  3. 先建一个容器,把其中的设置文件和静态网页拷贝出来

    1
    2
    3
    4
    5
    cd ~/Docker/nginx
    docker run --name c_nginx -p 80:80 -d nginx:1.22
    docker cp c_nginx:/etc/nginx/nginx.conf ~/Docker/nginx/conf
    docker cp c_nginx:/etc/nginx/conf.d ~/Docker/nginx/conf
    docker cp c_nginx:/usr/share/nginx/html ~/Docker/nginx
  4. 停止并删除容器

    1
    2
    docker stop c_nginx
    docker rm c_nginx
  5. 启动nginx并加入网络

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    docker run --name c_nginx \
    -p 80:80 \
    --network app-network \
    --network-alias nginx \
    -e TZ=Asia/Shanghai \
    -v ~/Docker/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
    -v ~/Docker/nginx/conf/conf.d:/etc/nginx/conf.d \
    -v ~/Docker/nginx/html:/usr/share/nginx/html \
    -v ~/Docker/nginx/log:/var/log/nginx \
    -v ~/Docker/public:/usr/share/nginx/public \
    -d nginx:1.22
  6. 查看nginx是否启动成功

    1
    2
    # 查看宿主机ip
    ifconfig

    在浏览器中输入http://宿主机ip,如果出现Welcome to nginx!则说明启动成功。

  7. 编辑设置文件,代理静态资源
    打开~/Docker/nginx/conf/conf.d/default.conf,在location /的大括号以下添加以下内容:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    location ~ (/geotiff/|/streamline/|/DEM/|/contour/) {
    root /usr/share/nginx/public;
    autoindex on;
    # CORS config
    add_header 'Access-Control-Allow-Methods' 'GET,OPTIONS,POST' always;
    add_header 'Access-Control-Allow-Credentials' 'true' always;
    add_header 'Access-Control-Allow-Origin' $http_origin always;
    add_header 'Access-Control-Allow-Headers' 'Authorization, Content-Type, X-Requested-With, Cache-Control' always;
    if ($request_method = OPTIONS ) { return 200; }
    }

    保存退出后重启nginx服务:

    1
    2
    docker exec -it c_nginx bash
    nginx -s reload

    在~/Docker/public下创建/DEM文件夹,访问http://宿主机ip/DEM/,如果看见/DEM目录下的文件列表则说明成功。

3.2 使用Dockerfile部署nginx-1.22

  1. ~/Docker/nginx下新建conf文件夹,用来存放nginx配置文件
    1
    mkdir -p ~/Docker/nginx/conf
    在conf/conf.d里放入default.conf文件,在conf里放入nginx.conf文件
  2. ~/Docker/nginx下新建html文件夹,放入你的静态网页
    1
    mkdir -p ~/Docker/nginx/html
  3. ~/Docker/nginx下新建Dockerfile文件,内容如下:
    1
    2
    3
    4
    5
    6
    FROM nginx:1.22
    RUN mkdir -p /usr/share/nginx/public
    COPY ./conf/nginx.conf /etc/nginx/nginx.conf
    COPY ./conf/conf.d/ /etc/nginx/conf.d/
    COPY ./html/ /usr/share/nginx/html/
    EXPOSE 80
  4. 构建镜像
    1
    docker build -t my_nginx ~/Docker/nginx
  5. 启动nginx并加入网络
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    docker run --name c_nginx \
    -p 80:80 \
    --network app-network \
    --network-alias nginx \
    -e TZ=Asia/Shanghai \
    -v ~/Docker/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
    -v ~/Docker/nginx/conf/conf.d:/etc/nginx/conf.d \
    -v ~/Docker/nginx/html:/usr/share/nginx/html \
    -v ~/Docker/nginx/log:/var/log/nginx \
    -v ~/Docker/public:/usr/share/nginx/public \
    -d my_nginx
  6. 如果有更新设置,更新设置后,重启nginx服务
    1
    2
    docker exec -it c_nginx bash
    nginx -s reload

4. 部署mysql-5.7.39

  1. 拉取mysql镜像

    1
    docker pull mysql:5.7.39
  2. 新建文件夹用来存放mysql配置文件和数据

    1
    mkdir -p ~/Docker/mysql/data
  3. 启动mysql,并加入网络

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    docker run -d \
    -p 3306:3306 \
    --name=c_mysql \
    --network app-network \
    --network-alias mysql \
    -v ~/Docker/mysql/data:/var/lib/mysql \
    -e MYSQL_ROOT_PASSWORD=123456 \
    -e TZ=Asia/Shanghai \
    mysql:5.7.39 \
    --character-set-server=utf8mb4 \
    --collation-server=utf8mb4_unicode_ci
  4. 等待十秒,等初始化完成,查看mysql是否启动成功

    1
    2
    docker exec -it c_mysql /bin/sh
    mysql -uroot -p

    没初始化完就进去可能不成功,退出重新等待几秒进入就能成功。如果出现mysql>则说明启动成功。

  5. 禁止远程登录root,并创建远程用户

    1
    2
    3
    4
    5
    6
    7
    8
    USE mysql;
    SELECT user,host FROM user;
    DELETE user FROM mysql.user WHERE user='root' AND host='%';

    CREATE USER 'zxf'@'%' IDENTIFIED BY 'zxf451001';
    CREATE DATABASE `zxf` CHARACTER SET 'utf8mb4';
    GRANT ALL PRIVILEGES ON zxf.* TO 'zxf'@'%';
    FLUSH PRIVILEGES;

4.1 导入数据库

  1. 将数据库文件拷贝到~/Docker/mysql/data

5. Dockerfile部署mysql

  1. 在目录下创建Dockerfile,内容如下

    1
    2
    3
    4
    5
    6
    7
    8
    9
    FROM mysql:5.7.38
    WORKDIR /docker-entrypoint-initdb.d
    ENV LANG=C.UTF-8
    ENV TZ=Asia/Shanghai
    RUN mkdir /mysql
    COPY import.sql /mysql
    ADD init.sql .
    WORKDIR /
    EXPOSE 3306
  2. 目录下放置init.sql(用于初始化的主文件,包括导入数据,创建用户,禁止root远程连接,改权限)和import.sql(要导入的数据)

  3. 打包

    1
    docker build -t my_mysql .
  4. 建立data文件夹

    1
    mkdir -p ~/Docker/mysql/data
  5. 运行容器

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    docker run \
    --name c_mysql \
    --network app-network \
    --network-alias mysql \
    -v ~/Docker/mysql/data:/var/lib/mysql \
    -p 3306:3306 \
    -e MYSQL_ROOT_PASSWORD=123456 \
    -d my_mysql \
    --character-set-server=utf8mb4 \
    --collation-server=utf8mb4_unicode_ci

6. 部署express后端服务(node-18.14.2)

  1. 创建文件夹

    1
    mkdir -p ~/Docker/express/log
  2. 新建Dockerfile

    1
    vim ~/Docker/express/Dockerfile

    写入以下内容:

    1
    2
    3
    4
    5
    6
    7
    FROM node:18.14.2
    COPY ./app /app
    WORKDIR /app
    RUN mkdir /log
    RUN npm install
    EXPOSE 3000
    CMD npm run start > /log/express.log 2>&1
  3. 将项目拷贝到~/Docker/express/app

  4. 构建镜像

    1
    docker build -t my_express ~/Docker/express
  5. 启动容器,并加入网络

    1
    2
    3
    4
    5
    6
    7
    docker run -d \
    --name c_express \
    -e TZ=Asia/Shanghai \
    -v ~/Docker/express/log:/log \
    --network app-network \
    --network-alias express \
    my_express

    如果进去就退出,可以把-d改成-it,去容器内部命令行检查问题原因(或者docker log)

7. 部署node应用(qweather)

  1. clone项目到~/Docker/service/qweather
    1
    git clone https://gitee.com/zxf001/wind-platform-service.git
    并将文件夹重命名为app
  2. 将package.json中的nodemon改成node
  3. 新建Dockerfile
    1
    vim ~/Docker/service/qweather/Dockerfile
    写入以下内容:
    1
    2
    3
    4
    5
    6
    FROM node:18.14.2
    COPY ./app /app
    WORKDIR /app
    RUN mkdir /log
    RUN npm install
    CMD npm run start > /log/qweather.log 2>&1
  4. 构建镜像
    1
    docker build -t my_qweather ~/Docker/service/qweather
  5. 创建log文件夹
  6. 启动容器,并加入网络
    1
    2
    3
    4
    5
    6
    7
    docker run -d \
    --name c_qweather \
    --network app-network \
    --network-alias qweather \
    -e TZ=Asia/Shanghai \
    -v ~/Docker/service/qweather/log:/log \
    my_qweather
    如果进去就退出,可以把-d改成-it,去容器内部命令行检查问题原因

8. 部署python应用

  1. 项目拷贝到~/Docker/service/realtimeData

    并将文件名重命名为app.py

  2. 新建Dockerfile

    1
    vim ~/Docker/service/realtimeData/Dockerfile

    写入以下内容:

    1
    2
    3
    4
    5
    6
    7
    FROM python:3.6.9
    RUN mkdir -p /runtime/log
    COPY . /runtime
    WORKDIR /runtime
    RUN pip3 install -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple/
    CMD python app.py > ./log/realtimeData.log 2>&1

  3. 构建镜像

    1
    docker build -t my_realtimedata ~/Docker/service/realtimeData
  4. 创建log文件夹

  5. 启动容器,并加入网络

    1
    2
    3
    4
    5
    6
    7
    docker run -d \
    --name c_realtimedata \
    --network app-network \
    --network-alias realtimedata \
    -e TZ=Asia/Shanghai \
    -v ~/Docker/service/realtimeData/log:/runtime/log \
    my_realtimedata

    如果进去就退出,可以把-d改成-it,去容器内部命令行检查问题原因

9. 部署flask框架

总体和部署python应用一样,只是导出requirements.txt的时候注意全部使用版本号的形式。

  1. 在开发环境导出requirements.txt
    1
    pip list --format=freeze > requirements.txt
    其中,要把distribute,pip,setuptools,wheel这几个包删除,还要把pywin32这个删除。
  2. 项目拷贝到~/Docker/flask
    并将文件夹重命名为app
  3. 创建日志文件夹
    1
    mkdir -p ~/Docker/flask/log
  4. 新建Dockerfile
    1
    vim ~/Docker/flask/Dockerfile
    写入以下内容:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    FROM python:3.10.9
    RUN mkdir -p /runtime/app
    RUN mkdir -p /runtime/log
    COPY requirements.txt /runtime
    RUN pip3 install -r /runtime/requirements.txt -i https://mirrors.aliyun.com/pypi/simple/
    COPY app /runtime/app
    EXPOSE 5000
    WORKDIR /runtime/app
    CMD python /runtime/app/app.py > /runtime/log/flask.log 2>&1
  5. 构建镜像
    1
    docker build -t my_flask ~/Docker/flask
  6. 启动容器,并加入网络
    1
    2
    3
    4
    5
    6
    7
    docker run -d \
    --name c_flask \
    --network app-network \
    --network-alias flask \
    -e TZ=Asia/Shanghai \
    -v ~/Docker/flask/log:/runtime/log \
    my_flask
    如果进去就退出,可以把-d改成-it,去容器内部命令行检查问题原因(或者docker log)