note-docker
docker
docker官网:https://www.docker.com/
Docker文档地址https://docs.docker.com/
安装Docker
安装

卸载旧的版本
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
需要的安装包
yum install -y yum-utils
设置镜像仓库
yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo # 默认是国外的不要安装
yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo #阿里云镜像
安装docker相关的东西 docker社区
yum makecache fast #更新
yum install docker-ce docker-ce-cli containerd.io
启动docker
systemctl start docker
查看版本
docker version
测试
docker run hello-world
卸载docker
# 卸载依赖
yum remove docker-ce docker-ce-cli containerd.io
# 删除资源
rm -rf /var/lib/docker
# /var/lib/docker docker默认的工作路径
基础命令
镜像命令
docker version
docker info
docker 命令 --help
帮助文档地址:https://docs.docker.com/reference/
docker images 查看所有本地主机上的镜像
docker search 搜索镜像
docker pull 下载镜像
docker rmi -f 删除镜像
docker save 镜像打包
docker load 加载镜像
容器命令
docker pull centos
docker run 启动命令
docker run [可选参数] image
# 参数说明
-- name " Name" 容器名字 tom1 tom2 用来区分容器
-d 后台运行方式运行
- it 使用交互方式运行,进入容器内查看内容
-p 指定容器的端口 -p 8080:8080
-p ip:主机端口:容器端口
-p 主机端口:容器端口
-p 容器端口
-p 随机指定端口
docker ps 列出正在运行的镜像
快捷键:ctrl+p+q 容器不停止退出
docker rm 删除容器
docker start 容器id #启动容器
docker restart 容器id #重启容器
docker stop 容器id #停止正在运行的容器
docker kill 容器id #强制停止正在运行的容器
后台启动容器
# 命令:docker run -d 镜像名
[root@localhost ~]# docker run -d cenos
#问题 docker ps 发现centos 停止了
# 常见的坑: docker容器使用后台运行,就必须要有要一个前台进程, docker发现没有应用,就会自动停止
# nginx,容器启动后,发现自己没有提供服务,就会立刻停止,就是没有程序
docker logs 查看日志
# 参数
-tf 显示日志
--tail number #显示日志条数
[root@localhost ~] docker logs -tf --tail 10 6bdfe1b2e2ba #显示指定行数的日志
查看容器中进行信息
docker top 6bdfe1b2e2ba
docker inspect 容器id
进入当前正在运行的容器
# 我们通常都是后台方式运行,需要进入容器修改一些配置
#命令
#方式一
[root@localhost ~]docker exec -it 容器id /bin/bash
#方式二
[root@localhost ~] docker attach 容器id
#docker exec #进入容器后 开启一个新的终端 可以在里面操作(常用)
#docker attach #进入容器正在执行的终端 不会启动新的进程
docker exec语法
指定工作目录执行命令
docker exec -it -w /usr tomcat7 pwd
以 root 用户身份进入容器(重点)
docker exec -it -uroot jenkins1 bash
从容器拷贝文件到主机上
docker cp 容器id:容器内路径:目的地的主机路径
小结



Commit镜像
docker commit 提交一个容器成为一个副本
docker commit -m="提交的描述信息" -a="作者" 容器id 目标镜像名:[TAG]
慎用
docker commit使用
docker commit命令虽然可以比较直观的帮助理解镜像分层存储的概念,但是实际环境中并不会这样使用。首先,如果仔细观察之前的
docker diff webserver的结果,你会发现除了真正想要修改的/usr/share/nginx/html/index.html文件外,由于命令的执行,还有很多文件被改动或添加了。这还仅仅是最简单的操作,如果是安装软件包、编译构建,那会有大量的无关内容被添加进来,如果不小心清理,将会导致镜像极为臃肿。此外,使用
docker commit意味着所有对镜像的操作都是黑箱操作,生成的镜像也被称为 黑箱镜像,换句话说,就是除了制作镜像的人知道执行过什么命令、怎么生成的镜像,别人根本无从得知。而且,即使是这个制作镜像的人,过一段时间后也无法记清具体在操作的。虽然docker diff或许可以告诉得到一些线索,但是远远不到可以确保生成一致镜像的地步。这种黑箱镜像的维护工作是非常痛苦的。而且,镜像所使用的分层存储,除当前层外,之前的每一层都是不会发生改变的,换句话说,任何修改的结果仅仅是在当前层进行标记、添加、修改,而不会改动上一层。如果使用
docker commit制作镜像,以及后期修改的话,每一次修改都会让镜像更加臃肿一次,所删除的上一层的东西并不会丢失,会一直如影随形的跟着这个镜像,即使根本无法访问到。这会让镜像更加臃肿。
使用数据卷
方式一: 直接使用命令来挂在 -v
docker run -it -v 主机目录:容器内目录
docker run -it -v /home/ceshi:/home centos /bin/bash
# 启动起来后可以通过 docker inspect 容器id
具名和匿名挂载
# 匿名挂载
-v 容器内路径
docker run ----name nginx01-v /ect/nginx nginx
# 查看所有的volume的情况
docker volume ls
local a52012ac555e544f2745377e706cef77ac1977974f571d534a444e85f969d7a0
# 具名挂载
docker run ----name nginx01-v juming-nginx:/ect/nginx nginx
# 查看具名
docker volume inspect juming-nginx
如何确定是具名挂载还是匿名挂载,还是指定路径挂载
-v容器内路径 #匿名挂载
-v 卷名:容器內路径 #具名挂载
-v /宿主机路径:容器內路径 #指定路径挂载!
# 通过-v容器内路径:ro rw改变读写权限
ro readonly #只读
rw readwrite #可读可写
#一旦这个了设互了客器权限,客器对我们挂载出来的内容就有限定了!
docker run -d -p --name nginx02-v juming-nginx: /etc/nginx: ro nginx
docker run -d -p --name nginx02-v juming-nginx: /etc/nginx: rw nginx
#ro:只要看到ro就说明该个径只能通过宿王机来操作,容器内部是无法操作
数据卷容器
容器之间的数据同步

-- volumes-from
# 启动3个容器测试
docker run -d -it --name docker01 centos
docker run -d -it --name docker02 --volumes-from docker01 centos
docker run -d -it --name docker03 --volumes-from docker02 centos
docker01的数据同步到docker02
docker02的数据同步到docker03
相当于继承关系
docker run -d -p 3306:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=1234 --name mysql01 mysql:5.7
docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=1234 --name mysql02 --volumes-from mysql01 mysql:5.7
结论
容器之间配信息的传递,数据着容器的生命周期一直持续到没有容器使用为止
但是一旦你持久化到了本地,这个时候,本地的数据是不会删除的!
DockerFile
基础知识:
1、每个保留关键字(指令)都是必须是大写字母
2、执行从上到下顺序执行
3、#表示注释
4、每一个指令都会创建提交一个新的镜像层,并提交
DockerFile指令
FROM #基础镜像,一切从这里开始构建
MAINTAINER #镜像是谁写的 姓名+邮箱
RUN #构建镜像的时候需要运行的命令
ADD #步骤:tomcat镜像,这个tomcat压缩包!添加内容
WORKDIR# 镜像工作的目录
VOLUME #挂载目录
EXPOSE #暴露端口
CMD #指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT #指定这个容器启动的时候要运行的命令,可以追加命令
ONBUILD #当构建一个被继承Dockerfile这个时候就会运行 ONBUILD的指令。触发指令
COPY #类似ADD,我们文件持贝到镜像中
ENV #构建的时候设环境变量!

Docker Hub中99%镜像都是从这个基础镜像过来的 FROM scratch 然后配需要的软件和配置来进行的构建
构建镜像
docker build -f dockerfile文件地址 -t 镜像名称:[版本] .
#最后有一个.
实例
使用URL github.com/creack/docker-firefox 的 Dockerfile 创建镜像。
docker build github.com/creack/docker-firefox
列出镜像的历史
docker history 镜像id
发布自己的镜像
注册自己的账号
1、注册账号:https://hub.docker.com/
2、确定这个这账号可以登录
3、在我们服务器上提交自己的像
[root@localhost local]# clear
[root@localhost local]# docker login --help
Usage: docker login [OPTIONS] [SERVER]
Log in to a Docker registry.
If no server is specified, the default is defined by the daemon.
Options:
-p, --password string Password
--password-stdin Take the password from stdin
-u, --username string Username
[root@localhost local]#
docker login -u 用户名 -p 密码
-u 用户名
-p 密码
上传镜像docker Hub
[root@localhost local]# docker push diytomcat:1.0
The push refers to repository [docker.io/library/diytomcat]
61419540ca7d: Preparing
943a150b53e6: Preparing
2ac8360636d3: Preparing
291f6e44771a: Preparing
denied: requested access to the resource is denied #被拒绝
[root@localhost local]#
发现上传的时候被拒绝了,更改名称 携带额外的信息
docker tag 镜像id docker地址
docker tag 6eb45446d0c2 2332810801/tomcat
docker push 2332810801/tomcat
Docker网络


结论: tomcat01和 tomcat02是公用的一个路由器, docker0
所有的容器不指定网络的情况下,都是 docker0路由的, docker0会给我们的容器分配一个默认的可用IP
容器互联—link
docker run -d -P --name tomcat01 tomcat
docker run -d -P --name tomcat03 --link tomcat01 tomcat
docker exec -it tomcat03 ping tomcat01
#其实这个 tomcat03就是在本地配置了 tomcat01的配置
docker exec -it tomcat01 cat /etc/hosts

现在玩Docker已经不建议使用link了
自定义网络!不用 docker!
docker0问题:他不支持容器名连接访问!
自定义网络
docker network ls 查看所有的docker网络
网络模式
bridge:桥接 docker(默认)
none:不配置网络
host:和宿主机共享网络
container:容器网络连通!(用的少!)
创建自定义网络
docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
[root@192 ydoc]# docker network inspect mynet
[
{
"Name": "mynet",
"Id": "2cfa03bb368ffc8f7427252fd686a2898556f2bf5b2b1080a821a00f7e997670",
"Created": "2021-08-25T14:32:26.55684087+08:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "192.166.0.0/16",
"Gateway": "192.166.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {
"83598e516c11f77142b8a59d87f42f6d6b444b2c2879657ad49193bb8e51e5ba": {
"Name": "tm01",
"EndpointID": "a881bb8034040fa347baf9ded320eee792eb599006225a765fd0314bc107a770",
"MacAddress": "02:42:c0:a6:00:02",
"IPv4Address": "192.166.0.2/16",
"IPv6Address": ""
},
"f45d372ced29ddd3b70d2b18b2e817e0151f006d8c776bf195c862b654b31c6a": {
"Name": "tm02",
"EndpointID": "34ec5f2edcc75b49d827a4bc534a7eaf600320b784aef430b7621a2409df0bda",
"MacAddress": "02:42:c0:a6:00:03",
"IPv4Address": "192.166.0.3/16",
"IPv6Address": ""
}
},
"Options": {},
"Labels": {}
}
]
[root@192 ydoc]#
网络连通
docker network connect mynet tomcat01

浙公网安备 33010602011771号