docker外的基本操作
|
|
|
|
docker基本目录
/etc/docker/ # docker的认证目录
/var/lib/docker/ # docker的应用目录
docker中的常用命令
镜像与容器类似于 类型和变量的关系
镜像(image)
搜索镜像
|
|
下载镜像
|
|
查看本地镜像
|
|
查询结果包括:
- REPOSITORY: 镜像名称
- TAG: 镜像版本
- IMAGE ID: 镜像id
- CREATED: 镜像的创建时间
- SIZE: 镜像的大小
重命名镜像
|
|
删除镜像
|
|
命令参数包括:
- -f : 强制删除
- –no-prune : 不移除该镜像的过程镜像,默认移除
保存镜像
|
|
|
|
导入镜像
|
|
命令参数包括:
- -i,–input 指定交互模式 : 指定导入的文件,不指定默认 STDIN
- -q,–quiet : 精简输出信息
查看镜像历史
|
|
命令参数包括:
- **-H :**以可读的格式打印镜像大小和日期,默认为true
- **–no-trunc :**显示完整的提交记录
- **-q :**仅列出提交记录ID
根据模板创建镜像
模板网站 https://download.openvz.org/template/precreated/
cat 模板文件名.tar | docker import - [自定义镜像名]
容器(container)
启动/关闭/终止/重启容器
|
|
|
|
|
|
命令参数包括:
- -a,–attach :在前台运行容器并输出日志
- -i,–interaction :启动并进入交互模式
查看本地容器
|
|
命令参数包括:
- **-a :**显示所有的容器,包括未运行的
- **-f :**根据条件过滤显示的内容
- **–format :**指定返回值的模板文件
- **-l :**显示最近创建的容器
- **-n :**列出最近创建的n个容器
- **–no-trunc :**不截断输出
- **-q :**静默模式,只返回容器id,常用于其他命令中
docker rm -f $(docker ps -a -q)
强制删除所有容器 - **-s :**显示总的文件大小
查询结果包括:
- CONTAINER ID: 容器 ID。
- IMAGE: 使用的镜像。
- COMMAND: 启动容器时运行的命令
- CREATED: 容器的创建时间
- STATUS: 容器状态
容器状态(STATUS)有7种:
- created(已创建)
- restarting(重启中)
- running 或 Up(运行中)
- removing(迁移中)
- paused(暂停)
- exited(停止)
- dead(死亡)
创建容器
创建但不启动
|
|
创建并启动
docker run [命令参数] 创建依赖的镜像 [容器内命令] [命令参数...]
命令参数包括:
- -a stdin : 指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项
- -d : 后台运行容器,并返回容器ID
- -i : 以交互模式运行容器,通常与 -t 同时使用,简写成 -it ,即创建虚拟输入终端并保持输入
- -P : 随机端口映射,容器内部端口随机映射到主机的端口
- -p : 指定端口映射,格式为:主机(宿主)端口:容器端口
- -t : 为容器重新分配一个伪输入终端,通常与 -i 同时使用
- –name=“nginx-lb” : 为容器指定一个名称为 nginx-lb ,不指定则直接生成一个随机 string
- –dns 8.8.8.8 : 指定容器使用的DNS服务器,默认和宿主一致
- –dns-search example.com : 指定容器DNS搜索域名,默认和宿主一致
- -h “mars” : 指定容器的hostname
- -e username=“ritchie” : 设置环境变量
- –env-file=[] : 从指定文件读入环境变量
- –cpuset=“0-2” or –cpuset=“0,1,2” : 绑定容器到指定CPU运行
- -m :设置容器使用内存最大值
- –net=“bridge” : 指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型
- –link=[] : 添加链接到另一个容器
- –expose=[] : 开放一个端口或一组端口
- –volume , -v : 绑定一个卷
- –rm :在容器退出时就能够自动清理容器内部的文件系统,等价于在容器退出后,执行
docker rm -v
,在测试时 容器内数据不需要保存可以使用此参数
容器内命令指 ps\ls 等命令,在容器启动后执行
命令参数则是 -a 之类的
暂停容器
|
|
|
|
删除容器
|
|
命令参数包括:
- -f :通过 SIGKILL 信号强制删除容器
- **-l :**移除容器间的网络连接,而非容器本身
- **-v :**并删除与容器关联的卷
进入容器
在创建时进入
|
|
进入后台容器
|
|
命令参数包括:
- **-d :**分离模式: 在后台运行
- **-i :**即使没有附加也保持STDIN打开
- **-t :**分配一个伪终端
启动容器时进入
使用命令进入
|
|
使用脚本进入
创建docker_in.sh脚本
|
|
调用脚本+容器名
如:./docker_in.sh myNginx
退出容器
Ctrl+D
或输入exit
docker update(容器参数更新)
docker update | Docker Documentation
|
|
命令参数:
Name, shorthand | Default | Description |
---|---|---|
--blkio-weight |
Block IO (relative weight), between 10 and 1000, or 0 to disable (default 0) | |
--cpu-period |
Limit CPU CFS (Completely Fair Scheduler) period | |
--cpu-quota |
Limit CPU CFS (Completely Fair Scheduler) quota | |
--cpu-rt-period |
Limit the CPU real-time period in microseconds | |
--cpu-rt-runtime |
Limit the CPU real-time runtime in microseconds | |
--cpu-shares , -c |
1024 | CPU资源权重,默认1024 |
--cpus |
Number of CPUs | |
--cpuset-cpus |
CPUs in which to allow execution (0-3, 0,1) | |
--cpuset-mems |
MEMs in which to allow execution (0-3, 0,1) | |
--memory , -m |
内存 | |
--memory-reservation |
Memory soft limit | |
--memory-swap |
Swap limit equal to memory plus swap: -1 to enable unlimited swap | |
--pids-limit |
API 1.40+ Tune container pids limit (set -1 for unlimited) | |
--restart |
no | 容器自启动策略(可选参数: no / on-failure / always / unless-stopped) |
–cpu-shares:
cpu权重(Default:1024) 即在cpu资源不足时的分配权重 比如 有四个容器 它们的cpu-shares被设置为 1024\512\2048\1024 那么CPU资源比例变为2:1:4:2
–restart的参数解释:
no: 不自动重启容器
on-failure: 在容器非正常退出时(退出状态非0),才会重启容器,后面可以加参数表示最多重启次数,比如:on-failure:3
always: 在容器退出时总是重启容器
unless-stopped: 在容器退出时总是重启容器,但是不考虑在Docker守护进程启动时就已经停止了的容器
例子:
将abebf7571666 hopeful_morse两个容器 设置 cpu权重为512 内存为300M
|
|
容器日志
|
|
命令参数包括:
- -f : 跟踪日志输出
- **–since :**显示某个开始时间的所有日志
- -t : 显示时间戳
- **–tail :**仅列出最新N条容器日志
容器重命名
|
|
查看容器端口
|
|
获取镜像/容器的详细信息
|
|
命令参数包括:
- **-f :**指定返回值的模板文件
- **-s :**显示总的文件大小
- **–type :**指定对象类型为:镜像,容器,数据卷等
根据容器创建镜像
|
|
命令参数包括:
- **-a :**提交的镜像作者;
- **-c :**使用Dockerfile指令来创建镜像;
- **-m :**提交时的说明文字;
- **-p :**在commit时,将容器暂停。
export 归档 直接打包到当前目录
|
|
数据卷
文件/文件夹 在容器中和宿主机的映射
创建容器时绑定数据卷
|
|
关于docker desttop的宿主机路径:
因为 wsl没有使用win原本的路径而是虚拟机的路径 所以可能会映射不到
需要在 /mnt/
目录下映射 其目录下的 c\d\wsl 等分别对应 win的c盘、d盘和wsl虚拟机的路径
例:
|
|
数据卷容器
作为数据卷的容器可以哪怕在不启动的状态下被多个容器共享
创建被数据卷容器
|
|
创建使用数据卷的容器
|
|
此时使用了数据卷 v-tmp 的 tmp01 和 tmp02就可以共享 /data-tmp文件夹
基于数据卷容器备份
|
|
命令解释
这是两个命令的合并
到nginx之前:
创建容器 tmp03 挂载 v-tmp 并建立容器内/backup和本地文件夹的映射
从tar开始:
打包数据卷容器v-tmp共享目录 /data-tmp 到本地目录映射的/backup
完成将 /data-tmp 备份到本地的 /backup目录
dockerfile
基于镜像创建自己的镜像的脚本
Shell格式和Exec格式
|
|
|
|
Exec 更类似于函数 以string
常用指令
配置指令
FROM:基于xxx镜像 FROM xxx
特殊的:scratch 代表空镜像,即不需要依赖镜像环境 为了安全,尽量不要使用非官方的镜像
EXPOSE:声明镜像内的服务监听端口,EXPOSE 8080
\ EXPOSE 8080/tcp
/后面是协议不写默认tcp,EXPOSE的作用不是直接映射端口,而是声明使用的端口,如果build时使用了-P
自动映射端口则会将 8080映射到宿主机的随机端口,如果要指定则应当使用 -p 手动指定
ARG :设置镜像创建时的变量,ARG [k=v]...
,编译结束后变量将不存在,docker内置了一些变量HTTP_PROXY、HTTPS_PROXY、FTP_PROXY、NO_PROXY
(不区分大小写),这些变量不需要再次声明,同docker build时的 –build-arg
LABEL:设置镜像使用的元数据,用来写一些描述信息 版本号之类的LABEL version="1.0"
,同 –label “version=1.0”
ENV:设置常量 MYSQL_VERSION 值为10ENV MYSQL_VERSION 5.6
调用 RUN apt-get install -y mysql-server="${MYSQL_VERSION}"
或$MYSQL_VERSION
?
ENTRYPOINT:镜像的默认入口命令,类似main函数,启动时作为根命令执行
VOLUME:创建数据卷,详见==基于dockerfile创建镜像==下面的例,以及上面的数据卷部分
USER:指定运行容器时的用户名或uid
WORKDIR:约等于 RUN cd,但如果没有路径会直接创建 例如 WORKDIR /test
在根目录创建/进入 test,能使用WORKDIR应当避免 run,尽量使用绝对路径
ONBUILD:创建子镜像时,自动执行的指令
SHELL:指定默认shell类型
操作指令
|
|
基于dockerfile创建镜像
docker build [命令参数] PATH | URL | [Dockerfile所在目录,.表示当前目录]
注意:在docker build时会将目标目录下的所以文件发送给服务端解析 所以dockerfile文件夹里尽量不要放无关的东西
命令参数包括:
- –add-host list:添加自定义主机名到ip映射
- –build-arg list:设置镜像创建时的变量,
--build-arg [k1=v1],[k2=v2]...
,编译结束后变量将不存在,docker内置了一些变量HTTP_PROXY、HTTPS_PROXY、FTP_PROXY、NO_PROXY
(不区分大小写),这些变量不需要再次声明 - –cache-from strings: cache-from,指定使用哪个镜像的cache(缓存),当一个dockerfile第二次构建镜像时时,在它会使用前一次构建时的缓存,直到遇到第一条不同的指令为止,如果不想使用cache,可以使用下面的no-cache参数
- –cpu-shares :设置 cpu 使用权重
- –cpu-period :限制 CPU CFS周期
- –cpu-quota :限制 CPU CFS配额
- –cpuset-cpus :指定使用的CPU id
- –cpuset-mems :指定使用的内存 id
- –disable-content-trust :忽略校验,默认开启
- -f,–file :指定要使用的Dockerfile路径
- –force-rm :设置镜像过程中删除中间容器
- –iidfile string:将镜像id写入文件
- –isolation string:使用容器隔离技术
- –label list :设置镜像使用的元数据,用来写一些描述信息 版本号之类的
LABEL version="1.0"
- -m,–memory bytes :设置内存最大值
- –memory-swap bytes:设置Swap的最大值为内存+swap,"-1"表示不限swap
- –no-cache :创建镜像的过程不使用缓存
- –pull :尝试去更新镜像的新版本
- –quiet, -q :安静模式,成功后只输出镜像 ID
- –rm :设置镜像成功后删除中间容器
- –shm-size :设置/dev/shm的大小,默认值是64M
- –squash :将 Dockerfile 中所有的操作压缩为一层
- –ulimit :Ulimit配置
- –tag, -t: 镜像的名字及标签,通常 name:tag 或者 name 格式;可以在一次构建中为一个镜像设置多个标签
- –network: 默认 default。在构建期间设置RUN指令的网络模式
例:
|
|
|
|
|
|
.dockerignore文件
docker build .
时会将当前目录下的所有文件从客户端发送到服务端进行读取、编译,.dockerignore
文件的作用在于指定那些不必要发送的文件,提供编译速度
docker-compose
使用一个yml文件来统一管理构成应用程序的服务
Compose 使用的三个步骤:
- 使用 Dockerfile 定义应用程序的环境
- 使用 docker-compose.yml 定义构成应用程序的服务,这样它们可以在隔离环境中一起运行
- 最后,执行 docker-compose up 命令来启动并运行整个应用程序
go&mysql的docker-compose实例
目录
go的东西和 mysql的东西分别放在两个文件夹下(compose貌似对文件夹名称的大小写不敏感)
testBash是一个持久的基于MySQL镜像的容器
docker-compose.yaml 在根目录中
|
|
==./Go/main.go==
|
|
==./Go/Dockerfile==
|
|
==./MySQL/test.sql==
|
|
==./MySQL/Dockerfile==
|
|
==./testBash/Dockerfile==
|
|
==./docker-compose.yaml==
depends_on: 依赖于,app依赖于mydb所以app在mydb之后创建
|
|
使用compose命令运行
|
|
借用golang_bash来直接访问数据库
|
|
问题:
depends_on保证了容器创建的顺序进行 但golang_db创建后它的mysql未必能在golang_app容器之前创建 golang_app 如果在mysql服务启动之前创建就会连接不到
解决方案参考:docker compose 服务启动顺序控制 - wang_yb - 博客园 (cnblogs.com)
docker仓库/dockerHub
push
连接dockerHub:docker login
然后账号密码,如果使用第三方储存库则按照它的规则来
重命名容器与dockerHub相同,如我的dockerHub仓库(repository)为 hub.docker.com/repository/docker/mhqdz/repository-test
欲上传myubuntu:v1则执行该重命名:docker tag myubuntu:v1 mhqdz/repository-test:latest
最后 push 即可:docker push mhqdz/repository-test
pull
直接docker pull即可
|
|
使用 registry 搭建本地仓库
参考:Registry私有仓库搭建及认证 - 暴走小骚年 - 博客园 (cnblogs.com)
使用创建本地仓库
|
|
|
|
命令解释:
- -p 5000:5000:本机与容器端口映射
- -v /mnt/d/docker/data/my-registry:/var/lib/registry:数据卷映射 本地的my-registry对于容器里的registry
push本地镜像
类似之前dockerhub只不过那个网址变成了localhost/
|
|
|
|
docker网络
docker网络性能较差,在大型容器集群中网络会成为很大的挑战
为此 出现了第三方解决方案:Pipework
,Weave
,Flannel
以及官方解决方案Libnetwork
(出世晚于第三方)
libnetwork
libnetwork提供了一个容器连接的go实现,libnetwork使用了CNM新型容器网络模型
(Container network model)
它使docker具备了跨主机的能力 同一子网络内的容器可以在不同的主机上互相通信
libnetwork实现的网络驱动
- bridge: Docker传统上默认用Linux网桥和Iptables实现的单机网络
-
host: 容器与主机共享同一 Network Namespace,共享同一套网络协议栈、路由表及 iptables 规则等。容器与主机看到的是相同的网络视图
-
null: 不提供网络服务,容器启动后无网络连接
-
remote: 扩展类型,预留给其他外部实现的方案,比如有一套第三方的 SDN 方案(如 OpenStack Neutron)就可以接进来
-
overlay: 用 vxlan 隧道实现的跨主机容器网络
CNM
概念定义
- 网络沙盒:容器内隔离的网络环境,包含了对网络栈的配置,包括对网络接口和路由表,DNS配置的管理。一个沙盒可以包含多个网络的多个Endpoint
- Endpoint:端点,可以理解为网络沙盒和网络之间的桥梁,一个Endpoint只能连接一个网络和一个沙盒,沙盒可以通过多个Endpoint连接多个网络
- 网络:网络包括一组可以相互连接的Endpoint
基础网络管理
在linux平台下,docker容器网络资源通过内核Network Namespace机制实现隔离,不同的Network Namespace下有各自的网络视图(网络设备、协议栈、路由表、防火墙规则等)
概念定义
- Namespace: 将内核的全局资源封装,使每个Namespace都有一份独立的资源,因此在不同Namespace下的进程使用同种资源互不干涉
- linux内核的6种namespace linux的6种Namespace介绍
- IPC: 隔离进程间通信
- UTC: 隔离主机名和域名信息
- Mount: 隔离文件系统挂载点
- PID: 隔离进程的ID
- Network: 隔离网络资源
- User: 隔离用户ID和组ID
docker的容器网络模式
docker&redis
|
|
|
|
docker&mongo
|
|
|
|
|
|
docker&hugo
|
|
|
|
|
|
|
|
|
|
|
|
|
|
乱七八糟的问题
|
|
|
|