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 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 docker ps docker ps -a docker ps -a | grep "<container_name>" docker stats <container_name_or_id> docker restart <> docker stop <> docker rm <> docker rmi <> 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
镜像加速 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
设置环境变量 构建时 另外,还可以使用ARG指令来定义构建时的参数,然后在ENV指令中使用这些参数来设置环境变量。例如:
1 2 ARG ENV_VARENV 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文件的格式如下:
shell 1 2 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 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 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} } clearcd ${work_path} unzip .output.zipmv .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 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 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 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>; 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:latestRUN rm /etc/nginx/conf.d/default.conf COPY dist /usr/share/nginx/html COPY nginx-custom.conf /etc/nginx/conf.d EXPOSE 80 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; 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 COPY --from=builder /wstest /usr/local/nginx/html COPY ./nginx /usr/local/nginx 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} } clearcd ${work_path} unzip dist.zipmv 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/jenkinsmkdir 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 deniedchmod 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 vi Dockerfile
1 2 3 4 5 6 7 8 9 10 FROM node:18.18 .0 WORKDIR /app 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 FROM web-server-baseWORKDIR /app COPY . . EXPOSE 7001 CMD ["sh" , "run.sh" ]
run.sh
1 2 3 npm run tsc npm run docker-start