Linux下的命令
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
|
systemctl --user start docker-desktop systemctl --user enable docker-desktop systemctl --user stop docker-desktop
systemctl start docker service docker start systemctl stop docker service docker stop systemctl restart docker service docker restart
systemctl status docker
journalctl -xe
|
Window下的命令
windows下的docker服务需要运行docker-desktop
Docker命令
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122
| docker compose version docker --version docker version
docker images docker images -a docker images -q
docker search 镜像地址名称 [--filter=STARS=3000]
docker pull镜像的仓库源[:tag]
docker rmi -f 镜像id docker rmi -f 镜像id 镜像id 镜像id docker rmi -f $(docker images -aq)
------------ 容器 ------------
docker run [可选参数] 镜像id|镜像名[:tag] [command [args]]
docker run -d 镜像名 curl localhost:主机端口
exit CTRL+P后CTRL+Q CTRL+D
docker ps
docker rm 容器id docker rm -f $(docker ps -aq) docker ps -a -q | xrags docker rm
docker start 容器id docker restart 容器id docker stop 容器id docker kill 容器id
docker exec [options] container command [args] docker exec -it 容器id /bin/bash docker attach [options] container
docker top 容器id
docker inspect [options] 容器name|镜像name
------------ 日志 ------------
docker logs 参数 容器名/容器id
docker logs -tf --tail 10 容器id
------------ 其他指令 ------------
docker port [OPTIONS] CONTAINER [PRIVATE_PORT[/PROTO]]
docker cp 容器id:容器内路径 目的主机路径
docker commit [options] container [repository:tag]
docker commit -m="描述信息,类似git的提交信息" -a="作者" 容器id 目标镜像名:[TAG]
------------ 添加加速器(使用其他镜像源) ------------
sudo vim /etc/docker/daemon.json
{ "registry-mirrors": ["https://yxzrazem.mirror.aliyuncs.com", "http://hub-mirror.c.163.com", "https://docker.mirrors.ustc.edu.cn"] }
systemctl daemon-reload systemctl restart docker
|
坑1:启动容器,自动停止
取决于:当前docker是否有前台进程正在运行(没有的话,docker容器会自动停止)
可能1:docker容器使用后台运行,就必须要有一个前台进程,docker发现没有应用了,就会自动停止 。例如:nginx,容器启动后发现自己没有提供服务,就会立刻停止,就是没有程序了。
可能2:docker run -d …
最后面加了/bin/bash
解决方案1:一般-it
启动的时候后面会有一个/bin/bash
。
解决方案2:父容器进程可能有一个子进程(即一个容器可能是一组进程)。
例如Nginx容器启动:当我们启动一个nginx服务时,它会启动一个父Nginx进程,然后父进程跨越进它的子进程,比如内存管理器、缓存加载器和工作器。
坑2:执行exit是否终止容器
取决于:当前的终端是不是在创建容器是的初始终端。如果是,则退出容器时,容器也停止;如果不是(例如进入容器时使用-it
模式),退出时,仅退出当前的终端,容器继续运行
举例:先进后出:
退出方式 |
exec进入方式(进入守护模式,同守护模式启动) |
attach进入方式(进入非守护模式) |
exit退出方式 |
容器还在 |
容器不在 |
ctrl+p+q退出方式(一定不终止容器) |
容器还在 |
容器还在 |
坑3:执行docker attach卡住
取决于:创建容器的时候,是后台运行模式还是交互模式,前者使用的是sshd-D
程序(不接收输入),后者使用的是bash
(交互型的,接收输入)
先出后进:docker attach
能否成功进入容器,取决于容器在run
启动时是交互模式还是守护模式启动的
常用Docker工具
1 2 3 4 5 6 7 8 9 10 11
| docker search dockerui docker pull abh1nav/dockerui docker run -d --privileged --name dockerui -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock abh1nav/dockerui curl localhost:9000
docker search portainer docker pull portainer/portainer docker run -d --name portainerUI -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock portainer/portainer curl localhost:9000
|
常见容器案例
1.Nginx
1 2 3 4 5
| docker search nginx docker pull nginx docker run -d --name nginx -p 3344:80 nginx
docker exec -it nginx /bin/bash
|
2.Tomcat
1 2 3 4 5 6
| docker pull tomcat docker run -d -p 3355:8080 --name tomcat01 tomcat docker exec -it tomcat01 /bin/bash
cp -r webapps.dist/* webapps
|
容器数据卷
作用
特点
- 生命周期:数据卷存在于宿主机的文件系统中,独立于容器,和容器的生命周期分离
- 存在形式:目录或文件
- 作用域:
- 容器和数据卷的数据变化实时同步发生。
- 数据卷的数据变换不影响镜像变化
- 挂载时:
- 数据卷空,容器中目录非空,则容器中数据复制到数据卷中
- 数据卷不空,容器中目录非空,则显示数据卷内容,容器目录仅显示数据卷中数据,其余被隐藏
挂载
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| ------------ 方式1:在docker run基础上,使用命令来挂载 -v ------------
docker run -it -v 主机目录:容器内目录 container [command] [args]
docker run -d -P --name nginx01 -v 容器内目录 container [command] [args] docker run -d -P --name nginx01 -v [主机目录|主机文件名]:容器内目录 container [command] [args]
docker volume ls docker volume inspect [options] volume [volume2…]
------------ 方式2:使用DockerFile来挂载 ------------
from centos volume ["volume01","volume01"] cmd echo "-----end-----" cmd /bin/bash
docker build -f dockerfile1的文件地址 -t 目标镜像名称[:tag] .
------------ --volumes-from实现容器之间的数据同步 ------------
docker run -it --name container02 --volumes-from container01 镜像:[tag]
|
DockerFile详解
构建发布镜像步骤:
- 构建一个dockerfile文件
- docker build构建成为一个镜像
- docker run运行一个镜像
- docker push发布镜像(DockerHub、阿里云镜像仓库)
构建Dockerfile文件
关键字 |
作用 |
备注 |
from |
指定父镜像 |
指定dockerfile基于哪个image构建 |
maintainer |
作者信息 |
表明作者(姓名+邮箱) |
label |
标签 |
表明dockerfile的标签,可以使用label代替maintainer,最终都是在docker image基本信息中可以查看 |
run |
执行命令 |
执行一段命令,默认是/bin/bash 格式:run command 或者 run [“command”, “param1”, “param”] run对docker容器造成的改变会反映到创建的镜像上 |
cmd |
容器启动命令 |
提供run容器时候的默认命令,和entrypoint配合使用 格式:cmd command param1 param2 或者cmd [“command”, “param1”, “param2”] 只有最后一个生效(一个dockerfile只有一个cmd) |
entrypoint |
入口 |
一般在制作一些执行就关闭的容器中使用 |
copy |
复制文件 |
build时,复制文件到image中 |
add |
添加文件 |
build时,添加文件到image中 不仅仅局限于当前build上下文,可以来源于远程服务 |
env |
环境变量 |
指定build时候的环境变量 可以在启动的容器时,通过-e覆盖 格式:env name=value |
arg |
构建参数 |
只在构建时候使用的参数 env相同名字的变量会覆盖arg的同名变量 |
volume |
定义外部可以挂载的数据卷 |
指定build的image哪些目录可以启动的时候挂载到文件系统中 启动容器时,使用-v绑定 格式:volume [“目录”] |
expose |
暴露端口 |
定义容器运行时候监听的端口 启动容器时使用-p来绑定暴露端口 格式:expose 8080或者expose 8080/udp |
workdir |
工作目录 |
指定容器内部的工作目录,如果没有创建则自动创建,如果指定/使用的时绝对地址,如果不是/开头那么是在上一条workdir的路径的相对地址 主要为run、cmd、entrypoint、copy、add指定工作目录 |
user |
指定执行用户 |
指定build或者启动的时候,用户在run cmd entrypoint执行的时候的用户
|
healthcheck |
健康检查 |
指定监测当前容器的健康监测的命令,基本没用,通常应用本身有健康监测机制 |
onbuild |
触发器 |
当执行from完成之后会执行onbuild的命令 不影响当前镜像,用处不大 |
stopsignal |
发送信号量到宿主机 |
该指令设置将发送到容器的系统调用信号以退出 |
shell |
指定执行脚本的shell |
指定run cmd entrypoint 执行命令的时候 使用的shell |
- workdir区别于docker build最后的path地址,前者指的时容器内的工作目录,后者是指镜像在构建过程中对主机中的资源操作时的上下文环境
- cmd和entrypoint区别
- cmd:指定这个容器启动时候要运行的命令,只有最后一个会生效,可替代
- entrypoint:指定这个容器启动时候要运行的命令,可以追加命令
Dockerfile案例
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| FROM centos:7 MAINTAINER lixingze<lixingzee@gmail.com>
ENV MYPATH /user/local WORKDIR $MYPATH
RUN yum -y install vim RUN yum -y install net-tools
EXPOSE 80
CMD echo $MYPATH CMD echo "-----end-----" CMD /bin/bash
|
Docker网路
容器之间可以互相ping通。
所有容器不指定网络情况下,都是docker0路由的,docker会给我们容器分配一个默认可用ip地址。
每个容器带来的网卡都是一对一对的,只要删除容器,对应网桥一对就没了。
docker中所有网络接口都是虚拟的,虚拟的转发效率高!(内网传递文件)
docker使用的时Linux的桥接,宿主机中是一个docker同期的网桥docker0。
docker0特点,默认,容器名不能访问, –link可以打通连接!(单向的,本质上在容器的hosts中增加了一个代理:172.17.0.3 tomcat02 56140c84bab0
)
所以,需要自定义网络!不使用Docker0!
自定义网络
网络模式:
- bridge:桥接模式,docker默认方式,自定义的网络也是bridge模式
- none:不配置网络
- host:和宿主机共享网络
- container:容器网络联通(用的很好,局限大)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| docker network ls
docker run -d -P --name tomcat01 tomcat docker run -d -P --name tomcat01 --net bridge tomcat
docker network create --driver 网络模式 --subnet 子网的网络号/子网掩码 --gateway 网关设置 网络名称 docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
docker run -d -P --name 容器名称 --net 网络名称 镜像文件
docker network inspect 容器id
|
等接触到集群的时候再继续更新docker中集群的知识