2022-03-08-docker基础

1. 基本概念

1.1 linux安装docker

  1. 自动安装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 安装

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, }; ```