docker 的基本使用
docker镜像命令和容器命令
==docker 作业练习==
==Docker 安装 Nginx==
# -d后台运行
#--name 给容器起名字
# -p 宿主机端口:容器内部端口
chy@ocean:~$ docker run -d --name nginx01 -p 8000:80 nginx
c83728c3f1d2d20cba7571a6fd08c506cb5bc14b1fbb9385b8fca0e687615e4d
chy@ocean:~$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c83728c3f1d2 nginx "/docker-entrypoint.…" 6 seconds ago Up 5 seconds 0.0.0.0:8000->80/tcp, :::8000->80/tcp nginx01
chy@ocean:~$ curl localhost:8000
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
==作业:docker 来装一个tomcat==
docker run -it --rm tomcat:9.0
# --rm 一般用来测试,用完就删
作业三:部署es+kibana
# es暴露端口多
#es 十分的耗内存
#es的数据一般挂在到安全目录!挂载
# --net somenetwork 网络配置
docker stats查看docker所用内存
-e环境配置修改
docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.6.2
chy@ocean:~$ curl localhost:9200
{
"name" : "c41cc3475bc3",
"cluster_name" : "docker-cluster",
"cluster_uuid" : "bhypk5Q-RvC4x_FOMoFF-g",
"version" : {
"number" : "7.6.2",
"build_flavor" : "default",
"build_type" : "docker",
"build_hash" : "ef48eb35cf30adf4db14086e8aabd07ef6fb113f",
"build_date" : "2020-03-26T06:34:37.794943Z",
"build_snapshot" : false,
"lucene_version" : "8.4.0",
"minimum_wire_compatibility_version" : "6.8.0",
"minimum_index_compatibility_version" : "6.0.0-beta1"
},
"tagline" : "You Know, for Search"
}
==可视化==
- portainer(先用这个)
docker run -d -p 8080:9000\
--restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer
==什么是portainer==
Docker 图像化界面管理工具,提供一个后台面板供我们操作
docker 镜像
==commit镜像==
docker commit 提交容器成为一个新的副本
docker commit -m=提交的描述信息 -a=“作者 ” 容器 id 目标镜像名:[TAG]
docker commit -a="chy" -m="add webapps application" 8f9660706542 tomcat_chy:1.0
==容器数据卷==
什么是容器数据卷
总结一句话:容器的持久化和同步操作!容器间也可以进行数据共享的!
使用数据卷
方式一:直接使用命令来挂载 -v
docker run -it -v 主机目录:容器内目录 类似于-p
docker run -it -v /home/chy/docker_ubuntu18_home:/home ubuntu:18.04 /bin/bash
"Mounts": [
{
"Type": "bind",
"Source": "/home/chy/docker_ubuntu18_home",
"Destination": "/home",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
}
],
chy@ocean:~/docker_ubuntu18_home$ vim ceshi.py
[2]+ 已停止 vim ceshi.py
chy@ocean:~/docker_ubuntu18_home$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d11b0f59e8b1 portainer/portainer "/portainer" 5 hours ago Up 5 hours 0.0.0.0:8088->9000/tcp, :::8088->9000/tcp elated_davinci
chy@ocean:~/docker_ubuntu18_home$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d591bed7171e ubuntu:18.04 "/bin/bash" 22 minutes ago Exited (0) 21 minutes ago wizardly_spence
d11b0f59e8b1 portainer/portainer "/portainer" 5 hours ago Up 5 hours 0.0.0.0:8088->9000/tcp, :::8088->9000/tcp elated_davinci
c83728c3f1d2 nginx "/docker-entrypoint.…" 6 hours ago Exited (0) 6 hours ago nginx01
ff3cf19a0b79 ubuntu:18.04 "/bin/bash" 7 hours ago Exited (127) 7 hours ago lucid_chatterjee
e19f4782e1c5 ubuntu:18.04 "bash" 7 hours ago Exited (130) 7 hours ago pedantic_panini
c29921e3edcf composetest_web "flask run" 2 weeks ago Exited (137) 2 weeks ago composetest-web-1
0a446f730c1f redis:alpine "docker-entrypoint.s…" 2 weeks ago Exited (0) 6 days ago composetest-redis-1
chy@ocean:~/docker_ubuntu18_home$ docker start d591bed7171e
d591bed7171e
chy@ocean:~/docker_ubuntu18_home$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d591bed7171e ubuntu:18.04 "/bin/bash" 22 minutes ago Up 3 seconds wizardly_spence
d11b0f59e8b1 portainer/portainer "/portainer" 5 hours ago Up 5 hours 0.0.0.0:8088->9000/tcp, :::8088->9000/tcp elated_davinci
chy@ocean:~/docker_ubuntu18_home$ docker attach d591bed7171e
root@d591bed7171e:/# ls
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
root@d591bed7171e:/# cd home/
root@d591bed7171e:/home# ls
ceshi.py
root@d591bed7171e:/home# cat ceshi.py
hello, linux updata
好处:我们以后修改只需要在本地修改即可,容器内会自动同步
实战:安装MySQL
思考:MySQL的数据持久化的问题
# 官方的运行,有配置密码
docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
-e 环境配置
#本主机上测试
docker run -d -p 3310:3306 -v /home/chy/docker_volume/mysql/conf:/etc/mysql/conf.d -v /home/chy/docker_volume/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWOR=chy --name mysql_chy mysql:5.7
具名和匿名挂载
# 匿名挂载
-v 容器内路径
docker run -d -P --name nginx -v /etc/nginx nginx
# 查看所有volume 的情况
chy@ocean:~$ docker volume ls
DRIVER VOLUME NAME
local 2198da5e7d86ba5a3de24d1aa71ab791bcb22e94e9f84e3d2f1fef73dc54d6b7
local a361a22ba8ef6ffffd78f233128054bd668b3e5315adffab8cfa79b5921ea720
local ba8715be0d242c0a4d004e38640b10c5dd5833f021920f8bd6fc0e830e012ebb
# 这里的乱码号就是匿名容器名
chy@ocean:~$ docker run -d -P --name nginx01 -v juming-nginx:/etc/nginx nginx
a221eae136c83f19fa5f87944efa8eb1e9ea7841b8b982c0b2a943626be6842d
chy@ocean:~$ docker volume ls
DRIVER VOLUME NAME
local 2198da5e7d86ba5a3de24d1aa71ab791bcb22e94e9f84e3d2f1fef73dc54d6b7
local a361a22ba8ef6ffffd78f233128054bd668b3e5315adffab8cfa79b5921ea720
local ba8715be0d242c0a4d004e38640b10c5dd5833f021920f8bd6fc0e830e012ebb
local juming-nginx
#这里的juming-nginx就是具名挂载
# 通过 -v 卷名:容器内路径
# 查看一下这个卷
chy@ocean:~$ docker volume inspect juming-nginx
[
{
"CreatedAt": "2023-05-05T10:03:11+08:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/juming-nginx/_data",
"Name": "juming-nginx",
"Options": null,
"Scope": "local"
}
]
挂载位置在/var/lib/docker/volumes/XXXX/_data内
#如何确定是具名挂载还是匿名挂载,还是指定路径挂载!
-V容器内路径 #匿名挂载
-V卷名:容器内路径 #具名挂载
-V/宿主机路径::容器内路径 #指定路径挂载!
==扩展==
#通过-V容器内路径:rorw改变读写权限
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就说明这个路径只能通过宿主机来操作,容器内部是无法操作
==Docker File==
dockerfile介绍
dockerfile是用来构建dokcer镜像的文件!命令参数脚本I
构建步骤:
1、编写一个dockerfile文件
2、docker build构建成为一个镜像
3、docker run运行镜像
4、docker push发布镜像(DockerHub、阿里云镜像仓库!)
dockerfile是面向开发的,我们以后要发布项目,做镜像,就需要编写dockerfile文件,这个文件十分简单!
==Docker镜像逐渐成为企业交付的标准,必须要掌握!==
步骤:开发,部署,运维。。。缺一不可
- DockerFile:构建文件,定义了一切的步骤,源代码
- Dockerlmages:通过DockerFile构建生成的镜像,最终发布和运行的产品!
- Docker容器:容器就是镜像运行起来提供服务器
FROM #基础镜镜像,一切从这里开始构建
MAINTAINER #镜像是谁写的,姓名+邮箱
RUN #镜像构建的时候需要运行的命令
ADD #步骤:tomcat镜像,这个tomcat压缩包!添加内容
WORKDIR #镜像的工作目录
VOLUME #挂载的目录
EXPOST #保留端口配置
ENTRYPOINT #指定这个容器启动的时候要运行的命令,可以追加命令
ONBUILD #当构建一个被继承DockerFile这个时候就会运行ONBUILD的指令。触发指令。
COPY #类似ADD,将我们文件拷贝到镜像中
ENV #构建的时候设置环境变量!
Dockerfile就是用来构建docker镜像的构建文件!命令脚本!先体验一下!
通过这个脚本可以生成镜像,镜像是一层一层的,脚本一个个的命令,每个命令都是一层!
#创建一个dockerfi1e文件,名字可以随机建议Dockerfi1e
#文件中的内容指令(大写)参数
FROM ubuntu:18.04
VOLUME ["volume01","volume02"]#匿名挂载,未来使用特别多
CMD echo "-------end-------"
CMD /bin/bash
"Mounts": [
{
"Type": "volume",
"Name": "22c524e180d59166fb95b5012971cfe1e5566bca1ceb5ecabd26fbe20d6371c0",
"Source": "/var/lib/docker/volumes/22c524e180d59166fb95b5012971cfe1e5566bca1ceb5ecabd26fbe20d6371c0/_data",
"Destination": "volume01",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
},
{
"Type": "volume",
"Name": "20a0e49e357f110e9452991d152ec1a8ac34d48a8c77b0fed84a1d8232f6282b",
"Source": "/var/lib/docker/volumes/20a0e49e357f110e9452991d152ec1a8ac34d48a8c77b0fed84a1d8232f6282b/_data",
"Destination": "volume02",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
],
测试一下刚才的文件是否同步出去了!
这种方式我们未来使用的十分多,因为我们通常会构建自己的镜像!
假设构建镜像时候没有挂载卷,要手动镜像挂载V卷名:容器内路径!
数据卷挂载
多个容器实现数据同步
chy@ocean:~/docker_volume$ docker run -it --name chy_ubuntu02 --volumes-from chy_ubuntu01 chy_ubuntu:1.0 /bin/bash
root@bd9d9eddee71:/# ls
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var volume01 volume02
root@bd9d9eddee71:/# cd volume01
root@bd9d9eddee71:/volume01# ls
docker01.txt
root@bd9d9eddee71:/volume01# touch docker02.txt
root@bd9d9eddee71:/volume01# ls
docker01.txt docker02.txt
root@bd9d9eddee71:/volume01# ls
docker01.txt docker02.txt docker03.txt
root@bd9d9eddee71:/volume01#
chy@ocean:~$ docker run -it --name chy_ubuntu03 --volumes-from chy_ubuntu02 chy_ubuntu:1.0 /bin/bash
root@0872aa038cfb:/# ls
bin dev home lib64 mnt proc run srv tmp var volume02
boot etc lib media opt root sbin sys usr volume01
root@0872aa038cfb:/# cd volume01
root@0872aa038cfb:/volume01# ls
docker01.txt docker02.txt
root@0872aa038cfb:/volume01# touch docker03.txt
root@0872aa038cfb:/volume01# ls
docker01.txt docker02.txt docker03.txt
root@0872aa038cfb:/volume01#
==主要使用的是 –volumes-from 实现容器间的数据共享 ==
结论:
容器之间配置信息的传递,数据卷容器的生命周期一直持续到没有容器使用为止。
但是一旦你持久化到了本地,这个时候,本地的数据是不会删除的!
docker-compose常用命令
docker-compose up -d nginx 构建建启动nignx容器
docker-compose exec nginx bash 登录到nginx容器中
docker-compose down 删除所有nginx容器,镜像
docker-compose ps 显示所有容器
docker-compose restart nginx 重新启动nginx容器
docker-compose run --no-deps --rm php-fpm php -v 在php-fpm中不启动关联容器,并容器执行php -v 执行完成后删除容器
docker-compose build nginx 构建镜像 。
docker-compose build --no-cache nginx 不带缓存的构建。
docker-compose logs nginx 查看nginx的日志
docker-compose logs -f nginx 查看nginx的实时日志
docker-compose config -q 验证(docker-compose.yml)文件配置,当配置正确时,不输出任何内容,当文件配置错误,输出错误信息。
docker-compose events --json nginx 以json的形式输出nginx的docker日志
docker-compose pause nginx 暂停nignx容器
docker-compose unpause nginx 恢复ningx容器
docker-compose rm nginx 删除容器(删除前必须关闭容器)
docker-compose stop nginx 停止nignx容器
docker-compose start nginx 启动nignx容器
Docker 小结
==Docker 网络(未来安排,集成部署)==
理解Docker0
清空所有环境
测试
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo#本机回环地址
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: enp5s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether c8:7f:54:57:48:62 brd ff:ff:ff:ff:ff:ff
inet 192.168.1.40/24 brd 192.168.1.255 scope global dynamic noprefixroute enp5s0
valid_lft 5419sec preferred_lft 5419sec#阿里云内网地址
inet6 fe80::f8aa:d5c6:44bb:4a07/64 scope link noprefixroute
valid_lft forever preferred_lft forever
4: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:87:11:cb:17 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever#docker地址
inet6 fe80::42:87ff:fe11:cb17/64 scope link
valid_lft forever preferred_lft forever
三个网络
root@e75dea24bd59:~/catkin_ws# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.17.0.4 netmask 255.255.0.0 broadcast 172.17.255.255
ether 02:42:ac:11:00:04 txqueuelen 0 (Ethernet)
RX packets 35 bytes 4999 (4.9 KB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
loop txqueuelen 1000 (Local Loopback)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
root@e75dea24bd59:~/catkin_ws# read escape sequence
chy@ocean:~$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e75dea24bd59 4483fce64730 "/entrypoint-melodic…" 46 hours ago Up 2 minutes elastic_brown
d11b0f59e8b1 portainer/portainer "/portainer" 2 days ago Up 11 minutes 0.0.0.0:8088->9000/tcp, :::8088->9000/tcp elated_davinci
chy@ocean:~$ ping 172.17.0.4
PING 172.17.0.4 (172.17.0.4) 56(84) bytes of data.
64 bytes from 172.17.0.4: icmp_seq=1 ttl=64 time=0.120 ms
64 bytes from 172.17.0.4: icmp_seq=2 ttl=64 time=0.078 ms
64 bytes from 172.17.0.4: icmp_seq=3 ttl=64 time=0.086 ms
#Linux可以ping通docker容器
原理
1、我们每启动一个docker容器,docker就会给docker容器分配一个ip,我们只要安装了docker,就会有一个网卡docker0
桥接模式,使用的技术是evth-pair技术!
#我们发现这个容器带来网卡,都是一对对的
# evth-pair就是一对的虚拟设备接口,他们都是成对出现的,一段连着协议,一段彼此相连
#正因为有这个特性,evth-pair充当一个桥梁,连接各种虚拟网络设备的
#Openstac,Docker容器之间的连接,OVS的连接,都是使用evth-pair技术
结论:tomcat01和tomcat(02是公用的一个路由器,docker0.
所有的容器不指定网络的情况下,都是docker0路由的,docker:会给我们的容器分配一个默认的可用IP
255.255.0.1/16域局域网
0000000.000000.000000.000000
255.255.255.255
结论
Docker 使用的是Linux的桥接,宿主机中是IGDocker容器的网桥 docker0
Docker 中所哟的网络接口都是虚拟的,虚拟的转发效率高(内网传递文件)
只要容器删除,对应网桥一对也没了
自定义网络
查看所有的docker网络
chy@ocean:~$ docker network ls
NETWORK ID NAME DRIVER SCOPE
0e0cf6ea89e8 bridge bridge local
2a0cbafc7650 composetest_default bridge local
9a4f385414eb host host local
7772e34bde04 none null local
网络模式
bridge:桥接docker(默认,自己创建也是使用桥接模式)
none:不配置网络
host:和宿主机共享网络
container:容器网络连通!(用的少!局限很大)
Usage: docker network COMMAND
Manage networks
Commands:
connect Connect a container to a network
create Create a network
disconnect Disconnect a container from a network
inspect Display detailed information on one or more networks
ls List networks
prune Remove all unused networks
rm Remove one or more networks
Run 'docker network COMMAND --help' for more information on a command.
#docker0特点:默认,域名不能访问,--1ink可以打通连接!
#我们可以自定义一个网络!
#--driver bridge
#--subnet192.168.0.0/16
#--gateway192.168.0.1
[root@kuangshen /]docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1
mynet
eb21272b3a35 ceaba11b4aa5bbff131c3fb09c4790f0852ed4540707438db052
[root@kuangshen /]docker network 1s