docker归纳
Docker让容器里面的进程直接运行在宿主机上(Docker 会做文件、网络等的隔离),这样一来 Docker 会 “体积更轻、跑的更快、同宿主机下可创建的个数更多”
安装
下载地址 安装成功后命令行执行docker
会出现说明
在windows下安装Docker Desktop失败
网上找到解决方法,推测还需要安装container服务 :
创建批处理文件containers.bat,内容如下
1
2
3
4
5
6pushd "%~dp0"
dir /b %SystemRoot%\servicing\Packages\*containers*.mum >containers.txt
for /f %%i in ('findstr /i . containers.txt 2^>nul') do dism /online /norestart /add-package:"%SystemRoot%\servicing\Packages\%%i"
del containers.txt
Dism /online /enable-feature /featurename:Containers -All /LimitAccess /ALL
pause以管理员身份运行,完成后并重启再次安装成功
执行指令报错:
1
error during connect: In the default daemon configuration on Windows, the docker client must be run with elevated privileges to connect.
发现公司电脑中没有Hyper-v
创建文件 Hyper-V.cmd,内容如下
1
2
3
4
5pushd "%~dp0"
dir /b %SystemRoot%\servicing\Packages\*Hyper-V*.mum >hyper-v.txt
for /f %%i in ('findstr /i . hyper-v.txt 2^>nul') do dism /online /norestart /add-package:"%SystemRoot%\servicing\Packages\%%i"
del hyper-v.txt
Dism /online /enable-feature /featurename:Microsoft-Hyper-V-All /LimitAccess /ALL以管理员身份运行,完成后并重启
再次进入 开始 —> 控制面板 —> 程序 —> 程序和功能 —> 启用或关闭windows功能
一般现在已经有了,但我公司电脑还是没找到,可能系统不是正版。。。 行!那我去官网更新系统 下载 Windows 10 (microsoft.com) 。经过一个小时的折磨,更新后终于有了hyper-v,启动docker也不再报错。
核心
Image: 镜像
和 windows 的那种 iso 镜像相比,Docker 中的镜像是分层的,可复用的,而非简单的一堆文件迭在一起(类似于一个压缩包的源码和一个 git 仓库的区别)。
Container :容器
容器的存在离不开镜像的支持,他是镜像运行时的一个载体
依托 Docker 的虚拟化技术,给容器创建了独立的端口、进程、文件等“空间”,Container 就是一个与宿机隔离 “容器”。容器可宿主机之间可以进行 port、volumes、network 等的通信。
Repository :仓库
- 与git仓库相似,拥有仓库名、tag。在本地构建完镜像之后,即可通过仓库进行镜像的分发 。
- 常用的 Docker hub 有 https://hub.docker.com/ 、 https://cr.console.aliyun.com/ 等
联合文件系统:
文件系统层层叠加,记录每次修改。
容器启动后所有在内的操作都基于容器中的镜像层
所有镜像基于基础镜像,新增、修改内容时,在当前基础上创建新的镜像层
基本使用
镜像
拉取镜像
1
docker pull <镜像名>
查看本地镜像
1
2
3
4docker images
可选项
-a --all查看所有镜像
-q --quiet只列出id搜索镜像
1
2
3docker search <镜像>
可选项
--filter过滤如: --filter=stars=3000 收藏大于3000删除镜像
1
2
3docker rmi -f <镜像> #删除指定镜像
docker rmi -f <镜像> <镜像> #删除多个镜像
docker rmi -f $(docker images -aq) #查找并删除所有镜像发布镜像到远程(docker hub)
1
2
3
4
5
6
7需要先登录
docker login -u 用户名
为镜像添加标签,相当于复制了一个名称不同的新镜像,但是ID相同
一般发布时为了避免远程重名,最好使用`docker tag`设置标签 推荐格式:作者/镜像:版本
docker tag <镜像> <新名称:标签>
发布
docker push <镜像>本地打包镜像为tar包
1
docker save -o <输出文件路径>
解析本地镜像tar包
1
docker load -i <输入文件路径>
容器
基于镜像创建容器
1
docker create --name <容器名> <镜像名>
运行容器
1
docker start <容器>
查看运行中的容器
1
2
3docker ps
-a 查看所有容器,包括未运行
-q 只展示id进入运行中的容器
1
2
3
4进入容器,并开启进入供操作的新终端
docker exec -it <容器> /bin/bash
进入容器,并直接进入正在运行的新终端
docker attach <容器> /bin/bash直接创建、运行容器
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17docker run [可选参数] <镜像名> /bin/bash
可选参数
--name <name> - 设置容器名,操作时可代替容器id
-d - 后台启动
-i - 交互方式运行
-t - 为容器重新分配一个伪输入终端,通常与 -i 同时使用
-p 指定端口
- 容器端口
- 主机端口:容器端口
-P 随机指定端口
-c "shell脚本" 运行时执行脚本,如:
shell脚本 输出hello、一秒执行一次
"while true;do echo hello;sleep 1;done"
--rm 运行的容器在停止后自动删除
-v 数据卷,映射容器内路径到外部主机路径,在外部对应路径修改即可同步修改容器中的内容(双向同步,里面修改外部一样变)
末尾加`:ro`只读 只能从容器外部改变
末尾加`:rw`读写 可读可写,默认提交容器作为镜像副本(本地)
1
2
3docker commit [参数] <容器> <目标名称>:[TAG]
-a --author "作者"
-m --message "描述"查看容器进程信息
1
docker top <容器>
查看容器元数据
1
docker inspect <容器>
从容器内拷贝文件到外部主机中
1
docker cp <容器>:<容器内文件路径> <外部路径>
查看容器占用cpu状态
1
docker stats
有的镜像如ubuntu、centos,在创建运行容器时,如果没有终端运行,会自动停止容器,需要加上-it
数据卷挂载
挂载数据卷有三种方式
匿名挂载 - 只指定路径
1
path #只指定容器内路径
具名挂载 - 为数据路径指定名称
1
2
3只指定容器内路径,并命名
<name>不能少于两个字符,会被当作容器内路径一部分
<name>:path指定目录挂载
1
path1:path2 #分别定义主机和容器内的路径
只有具名挂载的数据卷指定了
Name
,其他方式为随机码。可通过docker inspect <容器>
中Mounts
字段查询未指定路径的都在
/var/lib/docker/volumes/xx
数据卷容器
一种容器间共享数据的方式
1 | 同步指定容器的数据卷挂载 |
- 只要有容器使用,数据卷容器的生命周期就不会结束
- 删除容器,本机挂载的数据也不会被删除
Dockerfile
除了docker commit
,使用Dockerfile也可以定制镜像。Dockerfile中每个命令都会创建一层镜像层提交组成一个完整镜像,因此应该避免无意义的层造成镜像过于膨胀
1 | .表示上下文路径,将该路径下的本机文件复制打包(如COPY命令) |
1 | FROM <基础镜像> |
其它
查看日志
1
2
3docker logs [参数] <容器>
-tf 查看日志
--tail <number> 打印条数查看所有数据卷
容器内所有的卷
1
docker volume ls
示例
Node
DockerHub 等网站都提供了众多镜像,一般情况下我们都会从它那找个镜像作为基础镜像,然后再进行我们的后续操作。
从相关hub网站拉取ubuntu基础镜像
1
2#20.04是版本号
docker pull ubuntu:20.04基于ubuntu创建、运行、进入该容器
1
docker run -it --name runUbuntuContainer ubuntu:20.04 /bin/bash
在容器中安装node环境
首先要进入容器
1 | apt-get update |
Nginx
基于nginx创建运行容器
1
2
3run命令没有目标镜像时会自动去docker hub下载
-p将主机3344端口映射到容器80端口(nginx默认80)
docker run -p 3344:80 --name nginx01 nginx进入容器操作
1
docker exec -it <容器> /bin/bash
前端资源默认在
/usr/share/nginx/html
目录,可用-v
数据卷映射到主机指定路径的内容1
2$PWD是主机当前终端所在的路径,主机下对应文件夹不存在会自动创建,但需要重新执行命令
docker run -p 3344:80 -v $PWD/www:/usr/share/nginx/html --name nginx-test nginx
进入交互模式在容器中开启新操作终端后,外部会无法使用页面。需要后台模式开启(不能有
-it
),通过另外docker exec -it <容器id> /bin/bash
进入操作
配置文件nginx.conf在目录 **/etc/nginx/**下
直接使用vim等进入容器内修改比较麻烦,可以
-v
将配置文件映射到主机1
2直接修改当前主机路径下的nginx.conf即可
docker run -p 3344:80 -v $PWD/www:/usr/share/nginx/html -v $PWD/nginx.conf:/etc/nginx/nginx.conf --name nginx-test nginx配置nginx时注意资源的路径,镜像尽量精简,可能与平时使用有区别
Dockerfile
仅将配置文件和资源存放到容器中作为初始配置,运行时最好还需要手动设置数据卷
1
2
3
4
5
6
7
8
9
10#先准备好以下文件:
#配置文件nginx.conf、前端项目文件夹<project>
FROM nginx
COPY $PWD/nginx.conf /etc/nginx/nginx.conf
RUN ["rm", "-rf", "/usr/share/nginx/html"]
COPY $PWD/electric /usr/share/nginx/html
#只暴露容器端口,不映射到主机
#容器运行时-P可使随机主机端口与容器内该端口映射
EXPOSE 80
WORKDIR /usr/share/nginx
Verdaccio
启动
1
docker run -it --name verdaccio -p 4873:4873 /bin/bash
数据卷
将配置、缓存、插件等映射到主机,即使容器被删,数据也不会丢失
若报错
cannot open config
通常是路径失败没有找到配置文件,可使用$PWD
相对路径,在当前终端启动路径映射1
2
3
4
5docker run -it --name verdaccio -p 4873:4873 -v
通常.verdaccio-db.json在storage目录下,而该镜像初始config.yaml中是设置storage/data下
PWD/verdaccio/storage:/verdaccio/storage -v $PWD/verdaccio/plugins:/verdaccio/plugins verdaccio/verdaccio -v
conf下默认有config.yaml
PWD/verdaccio/conf:/verdaccio/conf自定义端口
使用环境变量
VERDACCIO_PORT
将会忽略conf/config.yaml中的配置,改变容器内服务的监听端口1
2-e参数修改环境变量
docker run -it --name verdaccio -p 8088:8088 -e "VERDACCIO_PORT=8088" -v $PWD/verdaccio/storage:/verdaccio/storage -v $PWD/verdaccio/plugins:/verdaccio/plugins -v $PWD/verdaccio/conf:/verdaccio/conf verdaccio/verdaccio使用https
Protocal在config.yaml中指定证书后,必须将环境变量的默认值(
http
)覆盖为https
1
docker run -it --name verdaccio -e "VERDACCIO_PROTOCOL=https" -p 8088:8088 verdaccio/verdaccio
DockerCompose部署
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19version: '3.1'
services:
verdaccio:
image: verdaccio/verdaccio
container_name: "verdaccio"
networks:
- node-network
environment:
- VERDACCIO_PORT=8088
ports:
- "8088:8088"
volumes:
- "./verdaccio/storage:/verdaccio/storage"
- "./verdaccio/conf:/verdaccio/conf"
- "./verdaccio/plugins:/verdaccio/plugins"
networks:
node-network:
driver: bridge配置远程访问
verdaccio镜像默认的config.yaml中没有配置listen,默认只能在本机访问。需要加入以下配置才能在远程正常访问(远程无法访问,本地通过ip访问看不到已发布的包):
1
2listen:
- 0.0.0.0:8088
其他问题可以参考docker部署verdaccio踩坑
可视化面板
- portainer
Docker网络
安装docker后,就会在主机创建docker0网桥(linux网桥):使用veth-pair技术作为桥梁连接虚拟网络设备。
veth-pair - 虚拟设备接口,成对出现:一段连接协议,一段彼此连接。
每启动一个容器,docker就会为其分配一个ip。容器间、容器与主机间可以通过docker0(未指定网络时)相互通信
网络模式
bridge
桥接模式,默认 创建docker0none
不配置host
和主机共享container
容器网络联通(有局限)
启动容器时参数加上
--link <容器>
就可以ping通指定容器,但反向不行。原理就剩在指定容器hosts文件中增加了docker0所分配的指定容器的ip映射。不建议使用。
查看所有网络
1
docker network ls
创建自定义网络
1
2
3
4
5创建
docker network create --driver <网络模式> --subnet <子网> --gateway <网关> <网络名称>
例:
子网 - 192.168.0.0/24 255个 192.168.0.0/16 65535个
网关 - 192.165.0.11
2
3使用
启动容器时 `--net <网络名称>`
在同一网络下的容器可以相互ping通,而默认的docker0不行推荐一个集群使用一个自定义网络,安全健康
跨网络联通
1
2
3将指定容器加入到其他网络 一个容器 两个ip
被加入网络中的容器与该容器可以相互ping通
docker network <网络> <容器>
- 本文作者: MR-QXJ
- 本文链接: https://mr-qxj.github.io/2021/12/20/部署/docker/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!