安装
-
windows安装
- 打开wsl2 这里要 确定windows版本
- 设置 - windows更新 - 开发者选项 - 开发人员模式(开启)
- 控制面板开启子系统
- 启用或关闭windows功能-适用于linux的子系统(勾选)
- Microsoft Store下载ubuntu18
- 开始菜单找到Microsoft Store 搜搜ubuntu下载下来就行
- 安装docker
-https://dockerdocs.cn/docker-for-windows/install/index.html
- 打开wsl2 这里要 确定windows版本
-
mac安装 直接在应用商店找docker就行
-
在Linux或Windows上安装Docker,以便在其上部署容器化应用程序。
详细
curl -sSL https://get.daocloud.io/docker | sh
docker run -d -p 6379:6379 --name redis redis:latest
// docker
run 运行一个软件
-d后台运行
-p 容器里面的6379暴露到宿主机6379
--name 容器命名
redis:latest 版本 正式的话最好固定一个版本 最新版本经常变化
镜像
- 查看镜像
- docker search 镜像名:tag tag就是具体的标签版本 也可以不加
docker images
// 查看镜像docker images ls
- docker images centos // 查看本地centos相关的镜像
- docker images redis -q // -q 只查看id
- docker pull // 拉取镜像
- docker search redis // 搜索仓库的redis hub.docker.com
- 删除镜像
- docker rmi hello-world
- 被删除的镜像,不得有依赖的容器记录 docker ps -a 可以查看容器记录 ,
docker rm 容器id
删除容器记录
- 导出镜像
- docker image save centos:latest > /opt/centos-latest-test01.tgz
- 导入镜像
- docker image load -i /opt/centos-latest-test01.tgz
- 查看镜像详细信息
- docker image inspect 镜像id
容器(镜像运行起来之后就叫容器)
注意:
- 容器内的进程必须处于前台运行状态,否则容器就会直接退出,自己部署一个容器运行,命令不得后台运行,前台运行即可
- 如果容器内什么事情都没做,容器就会刮掉,容器内必须有一个进程
- docker run 镜像名
- 如果镜像不存在本地,则会在线去下载该镜像
- docker run centos:7 这个写法会产生多条容器记录,且容器没有在本地跑,所以挂了- docker ps // 查看当前是否有容器在运行中 报错的话说明docker没有启动
- docker stop 容器id
- docker run -it 容器id bash // 进入容器内部 -i 交互式命令操作 -t开启一个终端 bash 进入容器后执行的命令
- centos 可以使用cat /etc/redhat-release 查看系统版本 这个时候使用uname -a没用
- ubuntu 可以使用 cat /etc/lsb-release 查看系统版本
- opensuse系统 cat /etc/SuSE-release
- exit 退出容器
- 开启一个活着的容器 docker ps可以看到的容器 -d参数 让容器后台跑(针对宿主机而言)
- docker run -d centos:latest ping baidu.com
- 丰富docker 运行参数
- –rm 容器挂掉后自动删除 一般用作测试
- –name aaa // 给容器起名字 aaa
- 查看容器日志
- docker logs -f 容器id // docker logs -f 80f // -f 刷新日志
- docker logs -f 80f | tail -5
- 进入正在运行的容器内
- docker exec -it 80f bash
- 查看容器详细信息
- docker container inspect 容器id
- 容器的端口映射 -p 宿主机端口:容器内暴露的端口
- nginx -d后台 --name 起名字 ,-p 宿主机的85端口访问容器内的80端口
- docker run -d --name uicheung_nginx -p 85:80 nginx
- 查看端口转发情况 docker port 容器id
root@uicheung-virtual-machine:~# docker port e7f 80/tcp -> 0.0.0.0:85 // 容器内的80转发到85端口 80/tcp -> [::]:85
- nginx -d后台 --name 起名字 ,-p 宿主机的85端口访问容器内的80端口
- 映射到一个没有被占用的随机端口 大写-P
- docker run -d --name uicheung_nginx01 -P nginx
// 从宿主机的32768端口访问容器内的80端口
- docker run -d --name uicheung_nginx01 -P nginx
- -e 指定环境变量
- 删掉所有的容器 docker rm -f ${docker ps -qa}
dockerfile指令
- 主要组成部分
- 基础镜像信息 FROM centos:7.8
- 制作镜像操作指令 RUN yum install openssh-server -y
- 容器启动时指令 CMD [“/bin/bash”]
- dockerfile指令
- FROM 这个镜像的妈妈是谁
- MAINTAINER 指定维护者信息 可以没有
- RUN 你想让他干啥
- ADD 添加宿主机的文件到容器,还多了一个自动解压功能
- COPY 作用和ADD是一样的,都是添加宿主机的文件到容器,COPY仅仅拷贝,ADD还多了一个自动解压功能
- WORKDIR 设置当前工作目录
- VOLUME 设置卷,挂载主机目录
容器在运行时,应该保证在存储层不写入任何数据,运行在容器内产生的数据,我们推荐是挂在在宿主机上维护
VOLUME /data # 将容器内的/data的文件夹挂在为匿名卷,任何向该目录写入的数据的操作,都不会被容器记录,保证容器存储层无状态理念
VOLUME [“/data1”,“/data2”] # 该容器运行及时 自动与宿主机的目录做好映射关系 - EXPOSE 指定对外的端口 在容器内暴露一个窗口
- ENV 设置环境变量,无论是在镜像构建时,还是容器运行,该变量都可以使用
$NAME
使用
ENV NAME=“uicheung”
ENV MYSQL_VERSION=5.6
RUN yun install mysql:$MYSQL_VERSION - ARG 设置环境变量,只是用于构建镜像需要设置的变量,容器运行时就消失了
- ENTRYPOINT
- CMD 在容器内运行某命令 CMD [“参数1”,“参数2”]
例如docker run -it centos:7 cat /etc/os-release
CMD [“cat”," /etc/os-release"]
CMD systemctl start nginx 这样写是错误的,容器会立即退出,docker容器必须要有一个前台运行的进程
CMD 【“nginx”,“-g”,“daemon off;”】才是正确的
dockerfile实战
- 编写dockerfile文件
FROM node:16-alpine3.15
RUN mkdir -p /home/app/
WORKDIR /home/app/
COPY package*.json ./
RUN npm config set registry https://registry.npm.taobao.org/
# 安装pnpm
RUN npm install -g pnpm
RUN npm install -g pm2
RUN pnpm install
COPY . .
EXPOSE 3000
ENTRYPOINT ["npm", "run"]
CMD ["start:pm2:prod"]
-
构建镜像
docker build -f ./Dockerfile -t cheung-admin:0.0.2 .
-
运行容器
docker run -d -e NODE_ENV=production -p 3000:3000 cheung-admin:0.0.2
-
访问测试
Docker-Compose
负责对多个docker容器快速编排(站在项目角度将一组相关容器整合在一起,对这组容器进行按照指定顺序启动)
version: "3"
services:
cheungAdmin-service-dev:
container_name: cheungAdmin-service-dev
build:
context: ./
dockerfile: Dockerfile
ports:
- "3000:3000"
environment:
RUNNING_ENV: 'dev'
networks:
- servicebus
mysql:
image: mysql:5.7
container_name: mysql
environment:
TZ: Asia/Shanghai
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: cheung_admin
ports:
- "3306:3306"
volumes:
- ./data/mysql/data:/var/lib/mysql
- ./deploy/sql/:/docker-entrypoint-initdb.d/
privileged: true
restart: always
redis:
image: redis:6.2.5
container_name: redis
ports:
- "6379:6379"
environment:
TZ: Asia/Shanghai
volumes:
- ./data/redis/data:/data:rw
command: "redis-server --requirepass 123456 --appendonly yes"
privileged: true
restart: always
networks:
servicebus:
name: servicebus
安装
windows 和mac安装docker会默认安装Docker-Compose,linux没有
-
从github上下载docker-compose二进制文件安装
- 下载最新版的docker-compose文件
sudo curl -L https://github.com/docker/compose/releases/download/1.16.1/docker-compose-uname -s
-uname -m
-o /usr/local/bin/docker-compose - 添加可执行权限
sudo chmod +x /usr/local/bin/docker-compose
- 测试安装结果
docker-compose --version
- 下载最新版的docker-compose文件
-
pip安装
sudo pip install docker-compose
Portainer
官方安装说明 portainer.io/installation
完整教程 https://zhuanlan.zhihu.com/p/530337389
生命周期
其他
- 常用容器
nginx: docker run -d centos:latest ping baidu.com
- Docker修改镜像仓库地址
- 修改配置文件
编辑配置文件,没有就创建一个
vim /etc/docker/daemon.json
文件内容如下:
这里的仓库地址可以写多个{ "registry-mirrors": [ “https://8x” ] }
2. 重启docker
查看一下结果systemctl daemon-reload systemctl restart docker systemctl status docker
docker info
看到已经配置成功了
-
查看宿主机ip地址
ip a
-
-
连接服务器
ssh root@ip地址 // 如 ssh root@324.234.326.222
回车之后输密码 -
linux查看系统信息 可以用于区分是否宿主机
1.uname -a (Linux查看版本当前操作系统内核信息)
uname -r : 显示操作系统的发行版号
2.cat /proc/version (Linux查看当前操作系统版本信息)
3.cat /etc/issue 或cat /etc/redhat-release(Linux查看版本当前操作系统发行版信息)
4.cat /proc/cpuinfo
lscpu (Linux查看cpu相关信息,包括型号、主频、内核信息等)
5.getconf LONG_BIT (Linux查看版本说明当前CPU运行在32bit模式下, 但不代表CPU不支持64bit)
6.hostname (查看服务器名称)
7.cat /etc/sysconfig/network-scripts/ifcfg-eth0
cat /etc/sysconfig/network-scripts/ifcfg-l0
ifconfig (查看网络信息)
8.lsblk (查看磁盘信息 – 列出所有可用块设备的信息,而且还能显示他们之间的依赖关系,但是它不会列出RAM盘的信息)
fdisk -l (观察硬盘实体使用情况,也可对硬盘分区)
df -k (用于显示磁盘分区上的可使用的磁盘空间) -
pm2常用指令
PM2常用命令:
pm2 start <script_file|config_file> [options] 启动指定应用,如pm2 start index.js --name httpServer;
pm2 stop <appName> [options] 停止指定应用,如pm2 stop httpServer;
pm2 list 把所有pm2启动实例列举出来,注意:pm2 stop 某个项目后,该项目还会存在pm2 list 的列表里面, 只是状态是 stop, 要想去掉该项目,用pm2 delete
pm2 reload|restart <appName> [options] 重启指定应用,如pm2 restart httpServer;
pm2 show <appName> [options] 显示指定应用详情,如pm2 show httpServer;
pm2 delete <appName> [options] 删除指定应用,如pm2 delete httpServer,如果修改应用配置行为,最好先删除应用后,重新启动方才生效,如修改脚本入口文件;
pm2 kill 杀掉pm2管理的所有进程;
pm2 logs <appName> 查看指定应用的日志,即标准输出和标准错误;
pm2 monit 监控各个应用进程cpu和memory使用情况;
pm2 startOrReload <appName> 如果项目没有启动就执行 start 如果项目正在运行 就执行relaod
提示 除了使用 appName 之外, 还可以使用 all: 全部程序 id: 该程序的 id