docker相关操作
本文最后更新于 2025年4月9日 晚上
1. 安装
创建一个新的docker用户组,将当前用户添加到docker用户组
1
2sudo groupadd docker
sudo usermod -aG docker $USER退出当前终端并重新登录以刷新用户组设置。
检查用户是否已经添加到Docker用户组:
1
id -nG
如果有必要,更新apt软件仓库:
1
sudo apt update
安装Docker的依赖软件包:
1
sudo apt-get install -y apt-transport-https ca-certificates curl gnupg-agent software-properties-common
添加Docker的GPG密钥
1
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
将Docker软件源添加到Ubuntu 18.04的apt软件仓库
1
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
再次更新apt软件仓库
1
sudo apt update
安装Docker CE
1
sudo apt install docker-ce
启动Docker服务
1
2
3sudo systemctl status docker
# 或者
service docker status如果Docker服务没有启动,则可以使用以下命令启动:
1
2
3sudo systemctl start docker
# 或者
service docker start现在,非root用户也可以使用Docker了。
更换国内源
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
docker network create app-network
- 查看网络
1
docker network ls
- 创建一个公共文件夹
1
mkdir -p ~/Docker/public
3.1 手动部署nginx-1.22
拉取nginx镜像
1
docker pull nginx:1.22
新建文件夹用来存放nginx配置文件
1
2
3mkdir -p ~/Docker/nginx/conf
mkdir -p ~/Docker/nginx/log
mkdir -p ~/Docker/nginx/html先建一个容器,把其中的设置文件和静态网页拷贝出来
1
2
3
4
5cd ~/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停止并删除容器
1
2docker stop c_nginx
docker rm c_nginx启动nginx并加入网络
1
2
3
4
5
6
7
8
9
10
11docker 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查看nginx是否启动成功
1
2# 查看宿主机ip
ifconfig在浏览器中输入
http://宿主机ip
,如果出现Welcome to nginx!
则说明启动成功。编辑设置文件,代理静态资源
打开~/Docker/nginx/conf/conf.d/default.conf
,在location /
的大括号以下添加以下内容:1
2
3
4
5
6
7
8
9
10location ~ (/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
2docker exec -it c_nginx bash
nginx -s reload在~/Docker/public下创建/DEM文件夹,访问
http://宿主机ip/DEM/
,如果看见/DEM目录下的文件列表则说明成功。
3.2 使用Dockerfile部署nginx-1.22
- 在
~/Docker/nginx
下新建conf
文件夹,用来存放nginx配置文件在conf/conf.d里放入1
mkdir -p ~/Docker/nginx/conf
default.conf
文件,在conf里放入nginx.conf
文件 - 在
~/Docker/nginx
下新建html
文件夹,放入你的静态网页1
mkdir -p ~/Docker/nginx/html
- 在
~/Docker/nginx
下新建Dockerfile
文件,内容如下:1
2
3
4
5
6FROM 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 - 构建镜像
1
docker build -t my_nginx ~/Docker/nginx
- 启动nginx并加入网络
1
2
3
4
5
6
7
8
9
10
11docker 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 - 如果有更新设置,更新设置后,重启nginx服务
1
2docker exec -it c_nginx bash
nginx -s reload
4. 部署mysql-5.7.39
拉取mysql镜像
1
docker pull mysql:5.7.39
新建文件夹用来存放mysql配置文件和数据
1
mkdir -p ~/Docker/mysql/data
启动mysql,并加入网络
1
2
3
4
5
6
7
8
9
10
11docker 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等待十秒,等初始化完成,查看mysql是否启动成功
1
2docker exec -it c_mysql /bin/sh
mysql -uroot -p没初始化完就进去可能不成功,退出重新等待几秒进入就能成功。如果出现
mysql>
则说明启动成功。禁止远程登录root,并创建远程用户
1
2
3
4
5
6
7
8USE 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 导入数据库
- 将数据库文件拷贝到
~/Docker/mysql/data
下
5. Dockerfile部署mysql
在目录下创建Dockerfile,内容如下
1
2
3
4
5
6
7
8
9FROM 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目录下放置init.sql(用于初始化的主文件,包括导入数据,创建用户,禁止root远程连接,改权限)和import.sql(要导入的数据)
打包
1
docker build -t my_mysql .
建立data文件夹
1
mkdir -p ~/Docker/mysql/data
运行容器
1
2
3
4
5
6
7
8
9
10docker 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
mkdir -p ~/Docker/express/log
新建Dockerfile
1
vim ~/Docker/express/Dockerfile
写入以下内容:
1
2
3
4
5
6
7FROM 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将项目拷贝到
~/Docker/express/app
下构建镜像
1
docker build -t my_express ~/Docker/express
启动容器,并加入网络
1
2
3
4
5
6
7docker 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)
- clone项目到
~/Docker/service/qweather
下并将文件夹重命名为app1
git clone https://gitee.com/zxf001/wind-platform-service.git
- 将package.json中的nodemon改成node
- 新建Dockerfile 写入以下内容:
1
vim ~/Docker/service/qweather/Dockerfile
1
2
3
4
5
6FROM node:18.14.2
COPY ./app /app
WORKDIR /app
RUN mkdir /log
RUN npm install
CMD npm run start > /log/qweather.log 2>&1 - 构建镜像
1
docker build -t my_qweather ~/Docker/service/qweather
- 创建log文件夹
- 启动容器,并加入网络 如果进去就退出,可以把-d改成-it,去容器内部命令行检查问题原因
1
2
3
4
5
6
7docker run -d \
--name c_qweather \
--network app-network \
--network-alias qweather \
-e TZ=Asia/Shanghai \
-v ~/Docker/service/qweather/log:/log \
my_qweather
8. 部署python应用
项目拷贝到
~/Docker/service/realtimeData
下并将文件名重命名为app.py
新建Dockerfile
1
vim ~/Docker/service/realtimeData/Dockerfile
写入以下内容:
1
2
3
4
5
6
7FROM 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构建镜像
1
docker build -t my_realtimedata ~/Docker/service/realtimeData
创建log文件夹
启动容器,并加入网络
1
2
3
4
5
6
7docker 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的时候注意全部使用版本号的形式。
- 在开发环境导出requirements.txt 其中,要把distribute,pip,setuptools,wheel这几个包删除,还要把pywin32这个删除。
1
pip list --format=freeze > requirements.txt
- 项目拷贝到
~/Docker/flask
下
并将文件夹重命名为app - 创建日志文件夹
1
mkdir -p ~/Docker/flask/log
- 新建Dockerfile 写入以下内容:
1
vim ~/Docker/flask/Dockerfile
1
2
3
4
5
6
7
8
9FROM 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 - 构建镜像
1
docker build -t my_flask ~/Docker/flask
- 启动容器,并加入网络 如果进去就退出,可以把-d改成-it,去容器内部命令行检查问题原因(或者docker log)
1
2
3
4
5
6
7docker run -d \
--name c_flask \
--network app-network \
--network-alias flask \
-e TZ=Asia/Shanghai \
-v ~/Docker/flask/log:/runtime/log \
my_flask