xb18
xb18
文章78
标签0
分类0
docker

docker

docker安装

https://cloud.tencent.com/document/product/213/46000

docker常用命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# docker把从官网拉取的镜像推送到本地仓库某个目录
docker pull node:18.18.0
docker tag node:18.18.0 hub.example.io/test/node:18.18.0
docker push hub.example.io/test/node:18.18.0
# 查看镜像
docker images node
docker images | grep 'wstest'
docker stats $(docker ps -qf "name=wstestnew")
# 构建
docker build -t your-image-name .
# 运行
docker run -d -p 80:80 your-image-name # -d 标志的含义是“detached”(分离模式),它使得容器在后台运行而不会阻塞控制台
# 查看容器
docker ps # 正在运行
docker ps -a # 包括关闭的
docker ps -a | grep "<container_name>" # 过滤
docker stats <container_name_or_id> # 查看容器资源使用情况
docker restart <> # 重启
docker stop <>
docker rm <> # 删除容器,或者使用 --force 选项强制删除正在运行的容器,即使容器正在使用
docker rmi <> # 删除本地镜像 或者使用 -f 或 --force 选项强制删除正在使用的镜像
# version
docker version

docker inspect imageName # 查看镜像信息
docker buildx imagetools inspect imageName # 查看镜像多架构
docker buildx build --platform=linux/amd64,linux/arm64 --build-arg buildCmd="${buildCmd}" -f dockerFileArm -t ${imgName} . --push # docker push命令不支持直接构建和推送跨平台镜像 需要用 --push

镜像加速

1
2
3
4
5
https://hub-mirror.c.163.com
https://docker.m.daocloud.io
https://ghcr.io
https://mirror.baidubce.com
https://docker.nju.edu.cn

设置环境变量

构建时

1
ENV <KEY>=<VALUE>

另外,还可以使用ARG指令来定义构建时的参数,然后在ENV指令中使用这些参数来设置环境变量。例如:

1
2
ARG ENV_VAR
ENV ENV_VAR=$ENV_VAR

这样在构建镜像时可以通过–build-arg参数来传递参数值,然后在Dockerfile中使用。

1
docker build --build-arg ENV_VAR=test .

启动时

1
2
3
docker run --env ENV_VAR=test <IMAGE>
docker run -e ENV_VAR=test <IMAGE>
docker run --env-file .env <IMAGE>

.env文件的格式如下:

1
2
KEY1=VALUE1
KEY2=VALUE2

shell

1
2
# 删除 Docker 中tag为 <none> 的镜像
docker rmi $(docker images -f "dangling=true" -q)

容器间通信

使用连接网络:通过创建自定义网络,使多个容器连接在同一个网络中,容器可以使用容器名称或IP地址相互通信

1
2
3
4
5
6
7
8
9
10
docker network create mynetwork

docker run --name container1 --network mynetwork image1
docker run --name container2 --network mynetwork image2

# 在容器2内部使用容器1的名称进行访问
curl http://container2:port

# 查看
docker network ls

Dockerfile命令

Dockerfile通常会包含如下命令:
FROM:用于指定父镜像,如centos:7.6.1810,除了注释行,FROM要放在Dockerfile文件的第一行;
ADD:用于添加宿主机的文件、目录等资源到镜像中,会自动解压tar.gz格式压缩包,不会自动解压zip压缩包;
COPY:类似于ADD,也是用于添加宿主机的文件、目录等资源到镜像中,但不会自动解压任何压缩包;
MAINTAINER:标注镜像的作者信息;
LABEL:设置镜像的属性标签;
ENV:用于设置容器的环境变量;
USER:指定运行操作的用户;
RUN:执行shell命令,但必须是非交互式的,例如yum/apt install安装服务一定要加上-y;简单来说,就是构建镜像时执行的命令,或者shell脚本;
VOLUME:用于定义卷,例如将宿主机的某个目录挂载到容器中;
WORKDIR:用于定义工作目录;
EXPOSE:声明要把容器的哪些端口映射到宿主机;
CMD:指定镜像启动为容器时的默认命令或脚本;
ENTRYPOINT:也可以指定容器启动时的命令或脚本,如果和CMD同时使用,会将CMD的命令当做参数传递给ENTRYPOINT后面的脚本

dockerfile 中的每个 FROM、RUN、COPY 命令都会创建一个单独的层,并增加镜像的整体大小和构建时间。

RUN ln -s

RUN ln -s /root/node_modules ./node_modules 是一个 Dockerfile 中的指令,用于在容器中创建一个符号链接(symbolic link)将 /root/node_modules 目录映射到当前工作目录下的 ./node_modules 目录。这样做的目的是共享宿主机的 node_modules 目录,以避免在容器中重复安装依赖项。

符号链接是一种特殊类型的文件,它是指向另一个文件或目录的引用。这意味着在容器内部对于 ./node_modules 目录的访问将会被重定向到 /root/node_modules 目录的内容。

请注意,使用符号链接将容器与宿主机的目录进行关联时,需要确保宿主机的 node_modules 目录存在且已经正确安装了依赖项。

这个命令通常在 Dockerfile 中的 RUN 指令中使用,用于在构建镜像时自动将宿主机的依赖项链接到容器中,以提升构建效率和避免重复安装依赖项。

nuxt

上传build后的.output.zip执行sh ./build.sh

1
2
3
4
5
FROM node:18                          
COPY ./wstest /wstest
# 执行shell脚本
COPY ./run.sh /run.sh
CMD ["sh", "/run.sh"]

run.sh

1
2
3
#!/bin/bas

exec node /wstest/server/index.mjs

build.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#!/bin/bash

set -e
work_path=$(cd "$(dirname "$0")";pwd)

filename="wstest"

clear(){
rm -rf ${work_path}/${filename}
}
clear

cd ${work_path}

unzip .output.zip

mv .output ${filename}

time=`date +%Y%m%d%H%M%S`
tagName="dev.${time}"
imgName="hub.io/test/${filename}:${tagName}"

echo "imgName===>${imgName}"

docker build -t ${imgName} .

docker push ${imgName}

clear

exec: exec会告诉linux内核,直接在当前shell脚本进程中,加载并执行目标程序;

因为exec会立即抹掉当前shell脚本进程中的各种数据,然后加载并执行目标程序代码,所以在exec命令之后,除了错误检查逻辑外,不应该再有其他逻辑,因为这些逻辑永远都不会被执行了

mysql

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
docker pull mysql:5.7

# -e MYSQL_ROOT_PASSWORD=password 设置MySQL的root用户密码为password
# --name mysql5.7 设置容器的名称为mysql5.7
# -p 3306:3306 将宿主机的端口3306映射到容器的端口3306
docker run -d --name mysql5.7 -e MYSQL_ROOT_PASSWORD=password -p 3306:3306 mysql:5.7
docker run -d --name mysql5.7 -p 3306:3306 -v /root/mysqldata:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
# 运行 本地目录/data/mysql
docker run -d -p 3306:3306 \
-v /data/mysql:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=your_password \
--name mysql5.7 \
mysql:5.7

# 查看
docker ps

# 连接mysql
docker exec -it <container_name_or_id> mysql -u root -p

# 进入
docker exec -it <container_id> /bin/sh

docker exec -it <container_id> bash

# 停止
docker stop <container_name_or_id>

# 移除
docker rm <container_name_or_id>

# 查看数据库
show databases;
# 切换数据库
use <database_name>;
# 查看table
show tables;
# 查看表结构
describe <table_name>;

redis

1
2
3
docker pull redis
docker run --name redis -p 6379:6379 --network mynetwork -d redis --requirepass yourpassword
docker exec -it redis redis-cli -a yourpassword

nginx

Dockerfile

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 使用一个合适的基础镜像作为起点
FROM nginx:latest

# 删除默认的 Nginx 配置文件
RUN rm /etc/nginx/conf.d/default.conf

# 将本地的 dist 目录复制到镜像中的指定位置
COPY dist /usr/share/nginx/html

# 修改 Nginx 配置文件
COPY nginx-custom.conf /etc/nginx/conf.d

# 暴露 Nginx 的 HTTP 端口
EXPOSE 80

# 启动 Nginx 服务
CMD ["nginx", "-g", "daemon off;"]

nginx-custom.conf

1
2
3
4
5
6
7
8
9
10
11
server {
listen 80;
server_name example.com; # 请将 example.com 替换为你的域名或 IP 地址

root /usr/share/nginx/html;
index index.html;

location / {
try_files $uri /index.html;
}
}

dockerfile打包

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 编译
FROM node:18.18.0 as builder

WORKDIR /wstest
COPY wstest .

# 生成镜像
FROM nginx:latest

# html静态文件
COPY --from=builder /wstest /usr/local/nginx/html

# nginx配置
COPY ./nginx /usr/local/nginx

# 执行shell脚本
COPY ./run.sh /run.sh
CMD ["sh", "/run.sh"]

build.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#!/bin/bash

set -e
work_path=$(cd "$(dirname "$0")";pwd)

filename="wstest"

clear(){
rm -rf ${work_path}/${filename}
}
clear

cd ${work_path}

unzip dist.zip

mv dist ${filename}

time=`date +%Y%m%d%H%M%S`
tagName="dev.${time}"
imgName="hub.io/test/${filename}:${tagName}"

echo "imgName===>${imgName}"

docker build -t ${imgName} .

docker push ${imgName}

clear

run.sh

1
exec nginx -g "daemon off;"

nginx文件夹

1
2
3
4
5
nginx                                                                                                                           
├── access.lua
└── conf
├── mime.types
└── nginx.conf

jenkins

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
docker pull jenkins/jenkins
mkdir jenkins_home
# 运行
docker run -d -p 8080:8080 -v /root/jenkins_home:/var/jenkins_home --name=my-jenkins-container jenkins/jenkins

docker run -d -p 8080:8080 -v /root/jenkins_home:/var/jenkins_home -v /var/run/docker.sock:/var/run/docker.sock -v /usr/bin/docker:/usr/bin/docker --name=my-jenkins-container jenkins/jenkins
# 查看密码
docker logs my-jenkins-container

Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock
…………………………………………………………
dial unix /var/run/docker.sock: connect: permission denied

chmod 777 docker.sock
https://blog.csdn.net/u014595589/article/details/107028711

nodejs

1
2
curl -sL https://rpm.nodesource.com/setup_18.x | sudo bash -
sudo yum install -y nodejs

构建base镜像

避免每次打包都重新安装node_modules

1
2
3
4
5
mkdir server

# 上传package-lock.json和package.json

vi Dockerfile
1
2
3
4
5
6
7
8
9
10
# 使用一个合适的基础镜像作为起点 t
FROM node:18.18.0

# 设置工作目录
WORKDIR /app

# 将本地的 dist 目录复制到镜像中的指定位置
COPY package*.json .

RUN npm config set registry http://mirrors.cloud.tencent.com/npm/ && npm install
1
docker build -t web-server-base .

打包镜像

1
2
3
4
5
6
7
8
9
10
11
12
# 使用base镜像
FROM web-server-base

# 设置工作目录
WORKDIR /app

# 将本地的 dist 目录复制到镜像中的指定位置
COPY . .

EXPOSE 7001

CMD ["sh", "run.sh"]

run.sh

1
2
3
npm run tsc

npm run docker-start
本文作者:xb18
本文链接:https://moelj.com/2023/11/30/docker/
版权声明:本文采用 CC BY-NC-SA 3.0 CN 协议进行许可