docker学习
Docker概述真实项目部署环境可能非常复杂,传统发布项目一个只需要一个jar包,运行环境需要单独部署。而通过Docker可将jar包和相关环境(如jdk,redis,Hadoop...)等打包到docker镜像里,将镜像发布到Docker仓库,部署时下载发布的镜像,直接运行发布的镜像即可。Docker容器使用沙箱机制,通过隔离机制,使每个发布的应用之间互相隔离,相互之间不会有任何接口。
优点:隔离,镜像轻巧,秒级启动。
文档地址:https://docs.docker.com/
仓库地址:https://hub.docker.com/
[*]Docker基本组成:
1.镜像(image):类似于一个模板,通过这个模板来创建容器服务,如tomcat镜像=》run命令运行镜像=》创建tomcat容器
2.容器(container):Docker利用容器技术,可独立运行一个或一组应用,是通过镜像来创建的。可以执行启动,停止,删除等命令。暂时可将容器理解为一个简易的linux系统。
3.仓库(repository):存放镜像的地方,分为共有仓库(如Docker hub)和私有仓库。
Docker安装
根据帮助文档:
#1.卸载旧版本
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
#2.安装包
sudo yum install -y yum-utils
#3.设置镜像仓库
sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo #默认国外的,非常慢
sudo yum-config-manager \
--add-repo \
https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo #推荐阿里云
#4.更新软件包索引
yum makecache fast
#4.安装Docker引擎 (docker-ce:社区版)
sudo yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
#5.启动Docker
sudo systemctl start docker
#docker version查看是否安装成功
#6.测试helloword
sudo docker run hello-world
#7.查看下载的hello-world镜像
docker images
#8.卸载docker
#移除Docker引擎
sudo yum remove docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin docker-ce-rootless-extras
#移除镜像
sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd阿里云镜像加速
[*]进入阿里云官网的容器镜像服务,找到镜像加速地址
[*]配置使用
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://1kc9p0un.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
数据卷容器
多个容器之间共享数据(通过 --volume-from)
# docker pull mysql
Using default tag: latest#如果不写tag,默认最新版
latest: Pulling from library/mysql
72a69066d2fe: Pull complete #分层下载
93619dbc5b36: Pull complete
99da31dd6142: Pull complete
626033c43d70: Pull complete
37d5d7efb64e: Pull complete
ac563158d721: Pull complete
d2ba16033dad: Pull complete
688ba7d5c01a: Pull complete
00e060b6d11d: Pull complete
1c04857f594f: Pull complete
4d7cfa90e6ea: Pull complete
e0431212d27d: Pull complete
Digest: sha256:e9027fe4d91c0153429607251656806cc784e914937271037f7738bd5b8e7709
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest#真实地址
#指定版本下载
# docker pull mysql:5.7
5.7: Pulling from library/mysql
72a69066d2fe: Already exists
93619dbc5b36: Already exists
99da31dd6142: Already exists
626033c43d70: Already exists
37d5d7efb64e: Already exists
ac563158d721: Already exists
d2ba16033dad: Already exists
0ceb82207cd7: Pull complete
37f2405cae96: Pull complete
e2482e017e53: Pull complete
70deed891d42: Pull complete
Digest: sha256:f2ad209efe9c67104167fc609cca6973c8422939491c9345270175a300419f94
Status: Downloaded newer image for mysql:5.7
docker.io/library/mysql:5.7
docker pull centosdocker run [参数] image
#参数说明:
--name="Name" #容器名称,tomcat1,Tomcat2
-d #后台运行
-it #交互方式运行,进入容器查看内容
-p #指定容器端口
-pip:主机端口:容器端口(常用)
-p主机端口:容器端口(常用)
-p容器端口
-P #随机指定端口
#测试
# docker run -it centos /bin/bash#启动并进入容器
#
#查看容器内的centos
# ls
bindevetchomeliblib64lost+foundmediamntoptprocrootrunsbinsrvsystmpusrvar
#退出容器(exit:退出容器并停止;ctrl+P+Q:容器退出不停止)
# exit
exit
#列出所有运行容器
# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a25b788abecd centos "/bin/bash" 3 minutes ago Exited (0) About a minute ago agitated_khorana
8e4b0bac5001 feb5d9fea6a5 "/hello" 3 hours ago Exited (0) 3 hours ago epic_hypatia
#删除容器
docker rm 容器id #删除指定容器,不能删除正在运行的容器,若强制删除,-f
docker rm -f $(docker ps -aq)#删除所有容器
docker ps -a -q|xargs docker rm #删除所有容器
#启动和停止容器
docker start 容器id #启动容器
docker restart 容器id#重启容器
docker stop 容器id #停止容器
docker kill 容器id ##docker run -d 镜像名
# docker run -d centos
#docker ps 发现centos停止了
#docker容器使用后台运行时,必须要有个前台进程,docker发现没有应用,就会自动停止。
#nginx,容器启动后,发现没有提供服务,就会自动停止。
可以用来实现多个mysql之间的数据共享
DockerFile介绍
DockerFile就是用来构建Docker镜像的,是一个命令脚本。
构建步骤:
[*]编写一个Dockefile文件
[*]docker build构建成为一个镜像
[*]docker run运行镜像
[*]docker push发布镜像(docker hub或者阿里云镜像仓库)
官网centos镜像:
很多官方镜像都是基础包,很多功能都没有,我们通常会制作自己的镜像。
DockerFile构建过程
[*]注意:
1.每个保留关键字都是大写字母。
2.每个指令都会创建提交一个新的镜像层,并提交。
[*]dockerfile指令说明:
docker logs
#显示指定条数的日志
-ft #显示格式时间戳
--tail 10#显示条数
# docker logs -ft --tail 10 ddeeded713ed
[*]构建自己的centos镜像(原始centos镜像没有vim和ipconfig命令)
#docker top 容器id
# docker top ddeeded713ed
UID PID PPID C STIME TTY TIME CMD
root 17484 17465 0 11:15 pts/0 00:00:00 /bin/bash# docker inspect ddeeded713eddocker exec -it 容器id /bin/bash
docker attach 容器id #docker cp 容器id:容器内路劲目标主机路劲
# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ddeeded713ed centos "/bin/bash" 6 hours ago Up 6 hours cool_wozniak
#查看主机路径
# cd /home
# mkdir test
# ls
cchuangtest
#进入容器内部
# docker attach ddeeded713ed
# cd home
# ls
# touch test.txt
# ls
test.txt
# exit
exit
#拷贝文件到主机上
# docker cp ddeeded713ed:/home/test.txt /home/test
Successfully copied 1.536kB to /home/test
# ls
cchuangtest
# cd test
# ls
test.txt
[*]CMD和ENTRYPOINT的区别
ENTRYPOINT 中的参数始终会被使用,而CMD中的额外参数可以在容器启动时动态替换掉。
如果Dockerfile文件既有CMD,又有ENTRYPOINT ,那么CMD将会被当做参数传递给ENTRYPOINT
Dockerfile制作Tomcat镜像
1.准备镜像文件,tomcat压缩包,jdk压缩包
#1.搜索镜像
# docker search nginx
#2.pull镜像
# docker pull nginx
#3.启动容器并开放端口
# docker run -d --name nginx01 -p 3344:80 nginx2.编写dockerfile文件
开放端口:firewall-cmd --zone=public --add-port=3344/tcp --permanentfirewall-cmd --list-ports发布自己的镜像
发布dockerhub
systemctl restart firewalld.service发布到阿里云
1.找到阿里云容器镜像服务
2.创建命名空间
3.创建镜像仓库
4.操作参考官方文档
小结图
Docker网络原理
理解Docker0
命令:iptables -A INPUT -p tcp --dport 3344 -j ACCEPT
[*]docker 是如何处理网络访问的?
1.我们每启动一个容器,docker就会为docker容器分配一个ip,只要安装了docker,就会有一个网卡docker0,桥接模式,使用veth-pair技术。
再启动一个容器,又多了一对网卡:
docker run -d --name nginx0 -p 3344:80 nginx
所有的容器不指定网络的情况下,都是通过Docker0路由的,docker会为容器分配一个可用ip,docker中的所有网络接口都是虚拟的。
容器互联 --link ;。
容器之间可以通过容器名ping通,如:
systemctl restart docker#1.es暴露的端口很多
#2.耗内存
#3.es数据一般要放到安全目录,挂载
$ docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.6.2
#启动之后linux卡住,耗内存
#查看cpu状态
docker stats
#关闭docker,增加es的内存限制,通过 -e 环境变量配置修改
$ docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xmx512m" elasticsearch:7.6.2
docker stats
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
de3ab3cae3fb elasticsearch01 97.21% 318MiB / 1.715GiB 18.11% 656B / 0B 108MB / 246kB 26发现tomcat03的host配置文件和tomcat02的联系
docker run -d -p 8088:9000 \
--restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer自定义网络互联
docker commit 提交容器成为一个新副本
#命令和git原理近似
docker commit -m="提交的描述信息" -a="作者" 容器id 目标镜像名:
#原tomcat镜像没有webapp下的应用,添加应用后提交镜像
# docker commit -a="cchuang" -m="添加应用" 1274e9395923 tomcat1.0
# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tomcat1.0 latest ad4efd5a4e82 24 seconds ago 684MB1.使用命令来挂载 -v
docker run -it -v 主机目录:容器内目录
docker run -it -v /home/test:/home tomcat /bin/bash
#启动后通过docker inspect查看挂载信息#1.拉取mysql镜像
# docker pull mysql:5.7
-d后台运行
-p端口映射
-v挂载
-e环境配置
--name容器名称
#2.运行容器,需要做数据挂载,安装启动mysql时,需要设置密码
# 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=123456 --name mysql01 mysql:5.7
#3.启动成功,从本地通过sqlyog连接服务器的3306,映射到容器内的3306
#4.查看本地挂载目录
# ls
cchuangmysqltest
# cd mysql
# ls
confdata
# cd data
# ls
auto.cnf ib_buffer_poolmysql server-key.pem
ca-key.pem ibdata1 performance_schemasys
ca.pem ib_logfile0 private_key.pem
client-cert.pemib_logfile1 public_key.pem
client-key.pem ibtmp1 server-cert.pem
#5.通过本地sqlyog创建一个test数据库,即docker容器内也会创建一个文件,查看本地挂载的data目录,发现多一个文件,挂载成功。
# ls
auto.cnf ib_buffer_poolmysql server-key.pem
ca-key.pem ibdata1 performance_schemasys
ca.pem ib_logfile0 private_key.pem test
client-cert.pemib_logfile1 public_key.pem
client-key.pem ibtmp1 server-cert.pem
#6.删除docker容器,linux本地挂载的data目录下的文件依旧存在,数据持久化。
# docker rm -f 60afb0e127e9
# ls
auto.cnf ib_buffer_poolmysql server-key.pem
ca-key.pem ibdata1 performance_schemasys
ca.pem ib_logfile0 private_key.pem test
client-cert.pemib_logfile1 public_key.pem
client-key.pem ibtmp1 server-cert.pem网络连通,即如何让docker0和自定义网络之间实现通讯(本质是容器和网卡实现通讯)
#匿名挂载(没有指定容器外的路径)
# docker run -d -p 80:80 --name nginx01 -v /etc/nginx nginx
#查看所有volume情况
# docker volume ls
DRIVER VOLUME NAME
local 1ef0259786a48805e8816ea03f5dafc92477a449d64117c4c3a4cda027906ba3
local 52eeb7ad21d8cff59fdeab57ed8e3c9ca868620a542b9c058a6db8ba8504f1f3#具名挂载(通过 -v 卷名:容器内路径)
# docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx
a4e76f8aecbd7889f85f7955eb1839924c4bf273fc807ef6cc0b2dab308c5f83
# docker volume ls
DRIVER VOLUME NAME
local juming-nginx
部署Redis集群,建立自己的redis网卡。
#查看一下挂载的卷
# docker volume inspect juming-nginx
[
{
"CreatedAt": "2023-04-17T17:33:31+08:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/juming-nginx/_data",
"Name": "juming-nginx",
"Options": null,
"Scope": "local"
}
]#挂载方式
-v 容器内路径 #匿名挂载
-v 卷名:容器外路径 #具名挂载
-v /宿主机路径:容器内路径#指定路径挂载IDEA整合Docker
[*]将springboot应用打成jar包,编写Dockefile文件
[*]将Dockerfile和jar包上传到服务器
#通过 -v 容器内路径:ro rw改变读写权限(对于容器来说,在容器内操作挂载出来的目录的权限)
roreadonly #只读 (只能从容器外部宿主机来操作,容器内部无法操作)
rwreadwrite#可读写
# docker run -d -P --name nginx01 -v juming-nginx:/etc/nginx:ro nginx
[*]通过Dockerfile生成镜像
#构建dockerfile文件
# vim dockerfile1
# cat dockerfile1
FROM centos
VOLUME ["volume01","volume02"]
CMD echo "----end---"
CMD /bin/bash
#构建镜像
# docker build -f dockerfile1 -t cchuang/centos .
[+] Building 0.1s (5/5) FINISHED
=> load build definition from dockerfile1 0.0s
=> => transferring dockerfile: 121B 0.0s
=> load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> load metadata for docker.io/library/centos:latest 0.0s
=> FROM docker.io/library/centos 0.0s
=> exporting to image 0.0s
=> => exporting layers 0.0s
=> => writing image sha256:da9e95cba3f789425b8d7437106995c796f02b5bb5c0b05aa2c43df4399ef0f0 0.0s
=> => naming to docker.io/cchuang/centos 0.0s
#启动容器运行新建的镜像
# docker run -it cchuang/centos /bin/bash
# ls
bindevetchomeliblib64lost+foundmediamntoptprocrootrunsbinsrvsystmpusrvarvolume01volume02
#查看挂载的路径
# docker inspect da9e95cba3f7
[*]启动容器
#启动三个容器,通过上面构建的镜像启动
# docker run -it --name docker01 da9e95cba3f7
# ls -l
[*]访问测试,成功
#创建docker02,通过--volume-from 继承docker01容器
# docker run -it --name docker02 --volumes-from docker01 da9e95cba3f7Docker Compose容器编排
Docker Swarm集群部署
Jenkins(CI/CD)
来源:https://www.cnblogs.com/huang580256/p/17320737.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!
页:
[1]