1. 基本概念
1.1 linux安装docker
- 自动安装docker
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
1.2 容器
FROM node:10-alpine
# 代表生产环境
ENV PROJECT_ENV production
# 许多 package 会根据此环境变量,做出不同的行为
# 另外,在 webpack 中打包也会根据此环境变量做出优化,但是 create-react-app 在打包时会写死该环境变量
ENV NODE_ENV production
WORKDIR /code
ADD . /code
RUN npm install && npm run build && npm install -g http-server
EXPOSE 80
CMD http-server ./public -p 80
FROM node:10-alpine
ENV PROJECT_ENV production
ENV NODE_ENV production
# http-server 不变动也可以利用缓存
RUN npm install -g http-server
WORKDIR /code
# 首次添加此两个文件,充分利用缓存
ADD package.json package-lock.json /code
RUN npm install --production
ADD . /code
RUN npm run build
EXPOSE 80
CMD http-server ./public -p 80
容器网络
veth pair
docker0
iptables -t nat -vnl DOCKER
2. dockerfile
2.1 单文件构建
在多阶构建出来之前使用单个文件进行构建,单文件就是将所有的构建过程(包括项目的依赖、编译、测试、打包过程)全部包含在一个Dockerfile中之下
2.2 多文件构建
- Dockerfile.run就是运行时程序所必须需要的一些组件的Dockerfile,它包含了最精简的库;
- Dockerfile.build只是用来构建,构建完就没用了;
- build.sh的功能就是将Dockerfile.run和Dockerfile.build进行组成,把Dockerfile.build构建好的东西拿出来,然后再执行Dockerfile.run,算是一个调度的角色。
2.3 多阶构建
完成多阶段构建我们只需要在Dockerfile中多次使用FORM声明,每次FROM指令可以使用不同的基础镜像,并且每次FROM指令都会开始新的构建,我们可以选择将一个阶段的构建结果复制到另一个阶段,在最终的镜像中只会留下最后一次构建的结果,这样就可以很容易地解决前面提到的问题,并且只需要编写一个Dockerfile文件。
// 守护进程,容器内进程关闭则容器销毁。
CMD nginx -g ‘daemon off;’
2.4 dockerfile 编写
云计算核心技术Docker教程:Dockerfile中ADD和COPY
打包 + nginx部署
FROM node:latest as builder
WORKDIR /app
COPY package.json
RUN npm install
COPY . .
RUN npm run build
FROM nginx:latest
COPY nginx.conf /etc/nginx
COPY --from=builder /app/dist /usr/share/nginx/html
//ps: 每一个指令的前缀都必须是大写的。
- 生成dockerfile
FROM nginx COPY static-html-directory /usr/share/nginx/html
- 打镜像
docker build -t zyx-nginx . // 如果需要使用非根目录下 dockerfile 的目录和名字 可以加 -f参数 docker build -t zyx-nginx . -f ./devops/dockerfile.nginx
- 运行容器
docker run --name zyx-nginx-ct -d -p 8080:80 zyx-nginx
- ADD和COPY: 将文件或目录复制到Dockerfile构建的镜像中
- EXPOSE: 指定运行该镜像的容器使用的端口,可以是多个。
- RUN : 指令告诉docker 在镜像内执行命令
- FROM :通过FROM指定的镜像名称,这个镜像称之为基础镜像,必须位于第一条非注释指令
- WORKDIR: 在容器内部设置工作目录
打镜像 docker build
docker build [OPTIONS] PATH | URL | -
docker build -t openresty:1.15.8.2 -f ./Dockerfile .
docker build -t zyx-nginx . -f ./devops/dockerfile
Nginx.conf 配置如下
events {
worker_connections 1024;
}
http{
server {
listen 80;
server_name localhost;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
}
3. docker常用指令
列出所有容器ID
docker ps -aq
查看所有运行或者不运行容器
docker ps -a
停止所有的container(容器),这样才能够删除其中的images:
docker stop $(docker ps -a -q) 或者 docker stop $(docker ps -aq)
如果想要删除所有container(容器)的话再加一个指令:
docker rm $(docker ps -a -q) 或者 docker rm $(docker ps -aq)
查看当前有些什么images
docker images
删除images(镜像),通过image的id来指定删除谁,重复时 加上tag
docker rmi <image id>
想要删除untagged images,也就是那些id为的image的话可以用
docker rmi $(docker images | grep "^<none>" | awk "{print $3}")
要删除全部image(镜像)的话
docker rmi $(docker images -q)
强制删除全部image的话
docker rmi -f $(docker images -q)
从容器到宿主机复制
docker cp tomcat:/webapps/js/text.js /home/admin
docker cp 容器名: 容器路径 宿主机路径
从宿主机到容器复制
docker cp /home/admin/text.js tomcat:/webapps/js
docker cp 宿主路径中文件 容器名 容器路径
删除所有停止的容器
docker container prune
删除所有不使用的镜像
docker image prune --force --all
或者docker image prune -f -a
停止、启动、杀死、重启一个容器
docker stop Name或者ID
docker start Name或者ID
docker kill Name或者ID
docker restart name或者ID
docker进入容器,查看配置文件
docker exec :在运行的容器中执行命令
-d :分离模式: 在后台运行
-i :即使没有附加也保持STDIN(标准输入) 打开,以交互模式运行容器,通常与 -t 同时使用;
-t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
docker exec -it f94d2c317477 /bin/bash
export 和 import 导出的是一个容器的快照, 不是镜像本身, 也就是说没有 layer。
你的 dockerfile 里的 workdir, entrypoint 之类的所有东西都会丢失,commit 过的话也会丢失。
快照文件将丢弃所有的历史记录和元数据信息(即仅保存容器当时的快照状态),而镜像存储文件将保存完整记录,体积也更大。
docker save 保存的是镜像(image),docker export 保存的是容器(container);
docker load 用来载入镜像包,docker import 用来载入容器包,但两者都会恢复为镜像;
docker load 不能对载入的镜像重命名,而 docker import 可以为镜像指定新名称。
4. 企业级镜像仓库
Harbor镜像仓库 搭建
Harbor基本使用
5. docker上传镜像
docker commit 容器id blowsysun/nginx_vue
docker push blowsysun/nginx_vue
docker inspect
mysql 安装
最新版本
docker pull mysql
5.7 版本 本文基于5.7版本
docker pull mysql:5.7
docker run -d \
-p 3306:3306 \
--name mysql \
-e MYSQL_ROOT_PASSWORD=jueduianquan996 \
mysql:5.7
docker exec -it mysql bash
mysql -uroot -p
# Enter password:
# mysql> show variables like '%datadir%';
show variables like '%datadir%';
拷贝容器配置文件
docker cp mysql:/etc/mysql /usr/local/mysql/conf
mysql容器的配置文件存在 /etc/mysql 下
映射 数据 文件吗
- /etc/mysql 为配置文件路径 ``` docker stop mysql docker rm mysql
docker run -d
-p 3306:3306
–name mysql
-v /usr/local/mysql/conf/mysql:/etc/mysql
-v /usr/local/mysql/data:/var/lib/mysql/
-e MYSQL_ROOT_PASSWORD=jueduianquan996
–restart always
mysql:5.7
// 备用
docker run
-p 3307:3306
–privileged=true
–name mysql
-v /home/mysql/conf:/etc/mysql/conf.d
-v /home/mysql/logs:/var/log/mysql
-v /home/mysql/data:/var/lib/mysql
-e MYSQL_ROOT_PASSWORD=123456
-d nanlist/mysql:5.7
### 修改mysql密码
set password for 用户名@localhost = password(‘新密码’);
### 问题
1. navicat无法远程连接mysql,
- 开启MySQL远程访问权限 允许远程连接
- 轻量服务器开通3306 端口访问
2.
### 查看 容器映射地址
// 找到运行中的容器 id
docker ps
docker inspect 容器Id
找到 HostConfig 字段
## 轻量服务器安装
unbuntu
1. 安装git
2. 安装docker
3. 安装nvm
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.35.2/install.sh | bash source ~/.bashrc
4. 安装nodejs
nvm install v16.18.1
5. 安装pm2
npm install pm2 -g
6. 运行nest
pm2 start ./dist/main.js -i 2 –name=payBack –watch pm2 start ./dist/main.js –name=payBack –watch
7. 修改ubuntu
sudo chmod -R 777 +文件名
8. docker权限
sudo chmod 666 /var/run/docker.sock
9. ubuntu 启用root账户
https://blog.csdn.net/thebestleo/article/details/123451471
10. 安装firefox
npx playwright install firefox
11. vue3添加lodash
引入包
pnpm install lodash-es @type/lodash-es
vite.config 添加配置,未配置将导致504问题
optimizeDeps: { include: [‘lodash’] }
12. echart使用技巧
设置内容区域位置
grid: { right: 60, // top: ‘30%’, x2: 20, y2: 30, x: 50, y: 80, }; ```