安装docker
#1.卸载旧的版本、 sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine #2.需要的安装包 yum install -y yum-utils #3.设置镜像的仓库 使用阿里云仓库 yum -config-manager \ --add-repo \ http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo # 更新yum 软件包索引 yum makecache fast # 安装docker 相关的 yum install docker-ce docker-ce-cli containerd.io # 启动docker systemctl start docker #查看版本 docker -v # hello world docker run hello-world #查看下载的hello world 镜像 docker images #卸载docker yum remove docker-ce docker-ce-cli containerd.io #删除资源 sudo rm -rf /var/lib/docker
#配置镜像加速器 sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://tuas0rv4.mirror.aliyuncs.com"] } EOF sudo systemctl daemon-reload sudo systemctl restart docker
底层原理
Docker是怎么工作的?
Docker 是一个Client -Server 结构的系统,Docker的守护进程运行在主机上,通过Socket从客户端访问!
DockerServer 接收到Docker-Client 的指令,就会执行这个命令!
Dokcer 为啥比VM K快呢?
1、docker 有比虚拟机更少的抽象层
2、docker利用的是宿主机的内核,vm需要的是Guest OS。
所以 说 新建一个容器的时候,docker不需要像虚拟机一样重新加载一个操作系统内核,避免引导。
虚拟机是加载Guest OS,分钟级别的,docker 是利用宿主机的操作系统,省略了这个复杂过程,秒级!
Docker的常用命令
帮助命令
docker version # 版本信息 docker info # 显示docker的系统信息,包括镜像和容器数量 docker --help # 帮助文档
帮助文档地址:https://docs.docker.com/engine/reference/commandline/app_upgrade/
镜像命令
[root@node1 ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE hello-world latest d1165f221234 3 months ago 13.3kB #可选项 -a, --all Show all images (default hides intermediate images) --digests Show digests -f, --filter filter Filter output based on conditions provided --format string Pretty-print images using a Go template --no-trunc Don't truncate output -q, --quiet Only show image IDs
docker search搜索镜像
#docker search mysql NAME DESCRIPTION STARS OFFICIAL AUTOMATED mysql MySQL is a widely used, open-source relation… 11057 [OK] mariadb MariaDB Server is a high performing open sou… 4192 [OK] mysql/mysql-server Optimized MySQL Server Docker images. Create… 821 [OK] percona Percona Server is a fork of the MySQL relati… 544 [OK] phpmyadmin phpMyAdmin - A web interface for MySQL and M… 257 [OK] centos/mysql-57-centos7 MySQL 5.7 SQL database server 88 #可选项 通过收藏来过滤 -f, --filter filter Filter output based on conditions provided [root@node1 ~]# docker search mysql --filter=STARS=3000 NAME DESCRIPTION STARS OFFICIAL AUTOMATED mysql MySQL is a widely used, open-source relation… 11057 [OK] mariadb MariaDB Server is a high performing open sou… 4192 [OK] [root@node1 ~]# docker search mysql --filter=STARS=5000 NAME DESCRIPTION STARS OFFICIAL AUTOMATED mysql MySQL is a widely used, open-source relation… 11057 [OK]
docker pull 拉取镜像
#docker pull 镜像名[:tag] [root@node1 ~]# docker pull mysql Using default tag: latest #如果不写tag 默认就是latest latest: Pulling from library/mysql b4d181a07f80: Pull complete # 分层下载docker image 的核心 联合文件系统 a462b60610f5: Pull complete 578fafb77ab8: Pull complete 524046006037: Pull complete d0cbe54c8855: Pull complete aa18e05cc46d: Pull complete 32ca814c833f: Pull complete 9ecc8abdb7f5: Pull complete ad042b682e0f: Pull complete 71d327c6bb78: Pull complete 165d1d10a3fa: Pull complete 2f40c47d0626: Pull complete Digest: sha256:52b8406e4c32b8cf0557f1b74517e14c5393aff5cf0384eff62d9e81f4985d4b # 签名 Status: Downloaded newer image for mysql:latest docker.io/library/mysql:latest # 真实地址 #指定版本下载 docker pull mysql:5.7 [root@node1 ~]# docker pull mysql:5.7 5.7: Pulling from library/mysql b4d181a07f80: Already exists # 已经存在的 a462b60610f5: Already exists 578fafb77ab8: Already exists 524046006037: Already exists d0cbe54c8855: Already exists aa18e05cc46d: Already exists 32ca814c833f: Already exists 52645b4af634: Pull complete bca6a5b14385: Pull complete 309f36297c75: Pull complete 7d75cacde0f8: Pull complete Digest: sha256:1a2f9cd257e75cc80e9118b303d1648366bc2049101449bf2c8d82b022ea86b7 Status: Downloaded newer image for mysql:5.7 docker.io/library/mysql:5.7
docker rmi 删除镜像
docker rmi -f 09361feeb475 #容器ID 删除 docker rmi -f 容器ID 容器ID 容器ID 容器ID #删除多个容器 docker rmi -f $(docker images -aq) #删除全部容器
容器命令
说明 我们有了镜像才可以创建容器,linux 下载一个centos 镜像来测试学习。
docker pull centos
新建容器并启动
docker run [可选参数] image #参数说明 --name="name" #容器名字 tomcat01 用来区分容器 -d #后台运行 -it #使用交互方式运行,进入容器查看内容 -P #指定容器的端口 -p 8080:8080 -P ip:主机端口:容器端口 -P 主机端口:容器端口 #常用的 -P 容器端口 容器端口 -p #随机指定端口 #启动并进入容器 [root@node1 ~]# docker run -it centos /bin/bash [root@4d3e450d5ec8 /]# #退出容器 exit
列出所有运行的容器
#docker ps 命令 #列出所有运行的容器 [root@node1 ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES -a #列出所有运行的容器+历史运行过的容器 [root@node1 ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 4d3e450d5ec8 centos "/bin/bash" 4 minutes ago Exited (0) 2 minutes ago nifty_northcutt 77a0ab3fa646 d1165f221234 "/hello" 3 hours ago Exited (0) 3 hours ago gallant_goldberg -n=? #显示最近创建的容器 [root@node1 ~]# docker ps -n=1 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 4d3e450d5ec8 centos "/bin/bash" 7 minutes ago Exited (0) 5 minutes ago nifty_northcutt -q #[root@node1 ~]# docker ps -aq 4d3e450d5ec8 77a0ab3fa646
退出容器
exit #直接容器停止并退出 ctrl +q+p # 容器不停止退出
删除容器
docker rm 容器id # 删除指定容器 不能删除正在运行的容器 docker rm -f $(docker ps -aq) # 删除所有容器
启动和停止容器的操作
docker start 容器id # 启动 docker restart 容器id # 重启 docker stop 容器id # 停止当前正在运行的容器 docker kill 容器id #强制停止
常用其他命令
后台启动容器
#命令 docker run -d centos #问题 docker ps 发现centos停止了 #常见的坑, docker容器使用后台运行,就必须要有一个前台进程,docker发现没有应用,就会自动停止。 #nginx ,容器启动后发现自己没有提供服务,就会立刻停止,就是没有程序了。
查看日志
docker logs -f -t --tail num 容器id # 显示条数 #自己编写一段脚本 [root@node1 ~]# docker run -d centos /bin/sh -c "while true;do echo semon;sleep 1;done" [root@node1 ~]# docker logs -f -t --tail 10 0f8d74ee2211 2021-06-28T08:09:02.318299293Z semon 2021-06-28T08:09:03.323007412Z semon 2021-06-28T08:09:04.329110071Z semon 2021-06-28T08:09:05.330689261Z semon docker logs -f -t #显示全部日志
查看容器中进程信息
docker top 容器id [root@node1 ~]# docker top 0f8d74ee2211 UID PID PPID C STIME TTY TIME CMD root 14737 14718 0 16:04 ? 00:00:00 /bin/sh -c while true;do echo semon;sleep 1;done root 23034 14737 0 16:11 ? 00:00:00 /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep 1
查看镜像元数据
docker inspect 容器id [root@node1 ~]# docker inspect 0f8d74ee2211 [ { "Id": "0f8d74ee22114255b34828ae5973af8f76886093ae4e8929c5687f95f76ca46c", "Created": "2021-06-28T08:04:27.53170449Z", "Path": "/bin/sh", "Args": [ "-c", "while true;do echo semon;sleep 1;done" ], "State": { "Status": "running", "Running": true, "Paused": false, "Restarting": false, "OOMKilled": false, "Dead": false, "Pid": 14737, "ExitCode": 0, "Error": "", "StartedAt": "2021-06-28T08:04:27.832891841Z", "FinishedAt": "0001-01-01T00:00:00Z" }, "Image": "sha256:300e315adb2f96afe5f0b2780b87f28ae95231fe3bdd1e16b9ba606307728f55", "ResolvConfPath": "/var/lib/docker/containers/0f8d74ee22114255b34828ae5973af8f76886093ae4e8929c5687f95f76ca46c/resolv.conf", "HostnamePath": "/var/lib/docker/containers/0f8d74ee22114255b34828ae5973af8f76886093ae4e8929c5687f95f76ca46c/hostname", "HostsPath": "/var/lib/docker/containers/0f8d74ee22114255b34828ae5973af8f76886093ae4e8929c5687f95f76ca46c/hosts", "LogPath": "/var/lib/docker/containers/0f8d74ee22114255b34828ae5973af8f76886093ae4e8929c5687f95f76ca46c/0f8d74ee22114255b34828ae5973af8f76886093ae4e8929c5687f95f76ca46c-json.log", "Name": "/amazing_pare", "RestartCount": 0, "Driver": "overlay2", "Platform": "linux", "MountLabel": "", "ProcessLabel": "", "AppArmorProfile": "", "ExecIDs": null, "HostConfig": { "Binds": null, "ContainerIDFile": "", "LogConfig": { "Type": "json-file", "Config": {} }, "NetworkMode": "default", "PortBindings": {}, "RestartPolicy": { "Name": "no", "MaximumRetryCount": 0 }, "AutoRemove": false, "VolumeDriver": "", "VolumesFrom": null, "CapAdd": null, "CapDrop": null, "CgroupnsMode": "host", "Dns": [], "DnsOptions": [], "DnsSearch": [], "ExtraHosts": null, "GroupAdd": null, "IpcMode": "private", "Cgroup": "", "Links": null, "OomScoreAdj": 0, "PidMode": "", "Privileged": false, "PublishAllPorts": false, "ReadonlyRootfs": false, "SecurityOpt": null, "UTSMode": "", "UsernsMode": "", "ShmSize": 67108864, "Runtime": "runc", "ConsoleSize": [ 0, 0 ], "Isolation": "", "CpuShares": 0, "Memory": 0, "NanoCpus": 0, "CgroupParent": "", "BlkioWeight": 0, "BlkioWeightDevice": [], "BlkioDeviceReadBps": null, "BlkioDeviceWriteBps": null, "BlkioDeviceReadIOps": null, "BlkioDeviceWriteIOps": null, "CpuPeriod": 0, "CpuQuota": 0, "CpuRealtimePeriod": 0, "CpuRealtimeRuntime": 0, "CpusetCpus": "", "CpusetMems": "", "Devices": [], "DeviceCgroupRules": null, "DeviceRequests": null, "KernelMemory": 0, "KernelMemoryTCP": 0, "MemoryReservation": 0, "MemorySwap": 0, "MemorySwappiness": null, "OomKillDisable": false, "PidsLimit": null, "Ulimits": null, "CpuCount": 0, "CpuPercent": 0, "IOMaximumIOps": 0, "IOMaximumBandwidth": 0, "MaskedPaths": [ "/proc/asound", "/proc/acpi", "/proc/kcore", "/proc/keys", "/proc/latency_stats", "/proc/timer_list", "/proc/timer_stats", "/proc/sched_debug", "/proc/scsi", "/sys/firmware" ], "ReadonlyPaths": [ "/proc/bus", "/proc/fs", "/proc/irq", "/proc/sys", "/proc/sysrq-trigger" ] }, "GraphDriver": { "Data": { "LowerDir": "/var/lib/docker/overlay2/082292596c516caca00e0ffe925038591af565857d52e14f975bf4be4b5ce339-init/diff:/var/lib/docker/overlay2/dab160a5c0a378de625a23b62d11a24d7438f050969cc3894a82e672f4cc999a/diff", "MergedDir": "/var/lib/docker/overlay2/082292596c516caca00e0ffe925038591af565857d52e14f975bf4be4b5ce339/merged", "UpperDir": "/var/lib/docker/overlay2/082292596c516caca00e0ffe925038591af565857d52e14f975bf4be4b5ce339/diff", "WorkDir": "/var/lib/docker/overlay2/082292596c516caca00e0ffe925038591af565857d52e14f975bf4be4b5ce339/work" }, "Name": "overlay2" }, "Mounts": [], "Config": { "Hostname": "0f8d74ee2211", "Domainname": "", "User": "", "AttachStdin": false, "AttachStdout": false, "AttachStderr": false, "Tty": false, "OpenStdin": false, "StdinOnce": false, "Env": [ "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" ], "Cmd": [ "/bin/sh", "-c", "while true;do echo semon;sleep 1;done" ], "Image": "centos", "Volumes": null, "WorkingDir": "", "Entrypoint": null, "OnBuild": null, "Labels": { "org.label-schema.build-date": "20201204", "org.label-schema.license": "GPLv2", "org.label-schema.name": "CentOS Base Image", "org.label-schema.schema-version": "1.0", "org.label-schema.vendor": "CentOS" } }, "NetworkSettings": { "Bridge": "", "SandboxID": "9fbd4aa5c4b6e2854cdc698d320be51f1c2cba41d690d6b89391276d7462f630", "HairpinMode": false, "LinkLocalIPv6Address": "", "LinkLocalIPv6PrefixLen": 0, "Ports": {}, "SandboxKey": "/var/run/docker/netns/9fbd4aa5c4b6", "SecondaryIPAddresses": null, "SecondaryIPv6Addresses": null, "EndpointID": "d57d2b31d79cab82c865a29f787b887453b40916c9fd6b5f31e070e33a70e57b", "Gateway": "172.17.0.1", "GlobalIPv6Address": "", "GlobalIPv6PrefixLen": 0, "IPAddress": "172.17.0.2", "IPPrefixLen": 16, "IPv6Gateway": "", "MacAddress": "02:42:ac:11:00:02", "Networks": { "bridge": { "IPAMConfig": null, "Links": null, "Aliases": null, "NetworkID": "e45daf867404c245d05a5db14da208fd13b52801027a58a717b64ad46c4580b3", "EndpointID": "d57d2b31d79cab82c865a29f787b887453b40916c9fd6b5f31e070e33a70e57b", "Gateway": "172.17.0.1", "IPAddress": "172.17.0.2", "IPPrefixLen": 16, "IPv6Gateway": "", "GlobalIPv6Address": "", "GlobalIPv6PrefixLen": 0, "MacAddress": "02:42:ac:11:00:02", "DriverOpts": null } } } } ]
进入当前正在运行的容器
#我们通常容器都是使用后台方式运行的,需要进入容器,修改一些配置 #命令 docker exec -it 容器id [root@node1 ~]# docker exec -it 0f8d74ee2211 /bin/bash [root@0f8d74ee2211 /]# ls bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var [root@0f8d74ee2211 /]# ps -ef UID PID PPID C STIME TTY TIME CMD root 1 0 0 08:04 ? 00:00:00 /bin/sh -c while true;do echo semon;sleep 1;done root 846 0 0 08:18 pts/0 00:00:00 /bin/bash root 877 1 0 08:18 ? 00:00:00 /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep 1 root 878 846 0 08:18 pts/0 00:00:00 ps -ef [root@0f8d74ee2211 /]# #方式二 docker attach 容器id [root@node1 ~]# docker attach 0f8d74ee2211 semon semon semon #docker exec 进入容器后开启一个新的终端可以在里面操作 常用 #docker attach 进入容器正在执行的终端,不会启动新的
从容器中拷贝文件到主机
docker cp 容器id:容器内路径 目的主机路径 [root@node1 home]# docker cp cb1c7c3aa103:/home/semon.java /home [root@node1 home]# ls admin semon.java #拷贝是一个手动过程,未来我们使用 -v 卷的技术,可以实现 自动同步
常用命令总结
attach #当前 shell下 attch连接指定运行镜像 build #通过Dockerfile定制镜像 commit # 提交当前容器为新的镜像 cp # 从容器中拷贝指定文件或者目录到 主机中 create # 创建一个新的容器 同 run 但不启动容器 diff # 查看docker 容器的变化 enents # 从docker 服务获取实时事件 exec # 在已存在的容器上运行命令 export # 导出容器的内容流 最为一个 tar归档文件 对应 import history # 展示一个镜像形成历史 images # 列出系统当前镜像 import # 从tar包的内容中创建一个新的文件系统映像 info #显示系统相关信息 inspect # 查看容器详细信息 kill # 杀死指定容器 load # 从一个tar包中加载一个镜像 login # 注册或者登陆一个docker源服务器 logout #从当前docker registry 退出 logs # 输出当前容器日志xinxx port # 查看映射端口对应的容器内部源端口 pause # 暂停容器 ps # 列出容器列表 pull # 从docker 镜像源服务器拉取指定镜像 push # 推送指定镜像至docker源服务器 restart # 重启运行的容器 rm # 移除一个或多个容器 rmi # 移除一个或多个镜像 run # 创建一个新的容器并运行一个命令 save # 保存一个镜像为一个tar包 search # 在docker hub 中搜索镜像 start # 启动容器 stop # 停止容器 tag #给源中镜像打标签 top # 查看容器中运行的进程信息 unpause # 取消暂停容器 version # 查看docker 版本号 wait # 截取容器停止时的退出状态值
docker 安装 nginx
docker search nginx docker pull nginx docker images docker run -d --name nginx01 -p 3344:80 nginx curl localhost:3344 docker exec -it nginx01 /bin/bash
docker 安装tomcat
#官方的使用 docker run -it --rm tomcat:9.0 #我们之前启动都是后台,停止容器之后,容器还可以查到,docker run -it --rm 一般用于测试 用完即删除 docker run -d -p 3355:8080 --name tomcat01 tomcat #发现问题 root@bc46a9be65b0:/usr/local/tomcat# cd webapps root@bc46a9be65b0:/usr/local/tomcat/webapps# ls root@bc46a9be65b0:/usr/local/tomcat/webapps# #linux 命令少了 没有webapps 阿里云镜像的原因 把不必要的都剔除了。 #保证最小可运行环境 root@bc46a9be65b0:/usr/local/tomcat# cp -r webapps.dist/* webapps
部署ES +kibaba
# es 暴露的端口很多! # es 十分的耗内存 # es 的数据一般需要放置到安全目录! 挂载 # --net somenetwork ? 网络配置 # 启动 elasticsearch $ docker run -d --name elasticsearch01 -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch # 启动后 异常卡 docker status 查看cpu 状态 #赶紧关闭,增加内存的限制 $ docker run -d --name elasticsearch01 -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS=“Xms64m -Xmx512m" elasticsearch
可视化
portainer (先用这个)
#docker 图形化界面管理工具! 提供一个后台面板供我们操作 docker run -d -p 3388:9000 \ --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer
commit 镜像
docker commit 提交容器成为一个新的副本 #命令和git原理类似 docker commit -m="提交的描述信息" -a="作者" 容器id 目标镜像名:[TAG]
实战测试
# 启动一个默认的tomcat #发现默认的tomcat webapps 下无文件 docker commit -a="semon" -m="add webapps app" 9c85c540f36d tomcat02:1.0
容器数据卷
什么是容器数据卷
docker的理念回顾
将应用和环境打包成一个镜像!
数据? 如果数据都再容器中,那么我们容器删除,数据就会丢失! 需求:数据可以持久化!
Mysql ,容器删了,删库跑路! 需求 Mysql 数据可以存储再本地!
容器之间可以有一个数据共享技术! docker容器中产生的数据,同步到本地!
这就是卷技术! 目录的挂载,将我们容器内的目录,挂在再linux上。
总结一句话: 容器的持久化和同步操作! 容器间也是可以数据共享的!
使用数据卷
方式1: 直接使用命令来挂载 -v
docker run -it -v 主机目录:容器内目录 docker run -it -v /home/ceshi:/home centos /bin/bash docker inspect 1587618bf29a "Mounts": [ { "Type": "bind", "Source": "/home/ceshi", "Destination": "/home", "Mode": "", "RW": true, "Propagation": "rprivate" } ], #停止容器 后 宿主机上修改文件 再启动容器,也会同步数据到容器中。 #好处 :我们以后修改配置信息只需要在本地修改即可,容器内会自动同步!
实战:安装Mysql
思考:mysql 的数据持久化问题!
#获取镜像 docker pull mysql:5.7 #运行容器 需要做数据挂载! 安装mysql 是需要配置密码的! #docker run -d -p 3310: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 #启动成功 可以连接到数据库
具名和匿名挂载
# 匿名挂载 -v 容器内路径 docker run -d -p --name nginx01 -v /etc/nginx nginx #查看所有卷的情况 docker volume ls [root@node1 ~]# docker volume ls DRIVER VOLUME NAME local 1d5efcd3e3fd8c94c92399d18e91a64c007271beaeb1c4779f4c3c47d99dfb96 local 2de35d8b85dc237289f2b5cd645e8574039af80f34cceb07cc506976df991fac local 3f84e0c71618ca9918dfd3f1c4be6220a595e58b5027ba77add5faa0944ea208 local 5d07b6631b4c43a12349cec27595b7b57fb421d881f4fbeb01d306b94f605129 local 70df0e79eada9a661efb0dfe4403806110df6f685bb10c4adb725a88a0741907 local 662bf01892bf89749135f06f92b0cffb0dbe89ece9116baaf5eceeb429a795c3 #这里发现都是匿名 #具名挂载 [root@node1 ~]# docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx 6ea465bcc542d194843616189259929cfebd3899dcec6d5325aaf63b3c3b09af [root@node1 ~]# docker volume ls DRIVER VOLUME NAME local 1d5efcd3e3fd8c94c92399d18e91a64c007271beaeb1c4779f4c3c47d99dfb96 local 2de35d8b85dc237289f2b5cd645e8574039af80f34cceb07cc506976df991fac local 3f84e0c71618ca9918dfd3f1c4be6220a595e58b5027ba77add5faa0944ea208 local 5d07b6631b4c43a12349cec27595b7b57fb421d881f4fbeb01d306b94f605129 local 70df0e79eada9a661efb0dfe4403806110df6f685bb10c4adb725a88a0741907 local 662bf01892bf89749135f06f92b0cffb0dbe89ece9116baaf5eceeb429a795c3 local cc3f870cc847a991494f2276821bd4d9a0ec431f7ac5ae77a59c3be04c04b78f local e0a8116978af231c376b6dbfe02036b58e89efe6b6e50fec46c52d9393f242ec local fb4de6e70d5496641d9e133055725e45681847f8cc7317506e2b5e004df69b59 local juming-nginx # 通过-v 卷名:容器内路径 #查看一下 这个卷
所有的docker容器内的卷,没有指定目录的情况下都是在/var/lib/docker/volumes/xxxxx/_data
我们通过具名挂载可以方便的找到我们的一个卷,大多数情况在使用的 具名挂载
# 如何确定是具名挂载还是匿名挂载,还是指定路径挂载! -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 就说明这个路径只能通过宿主机来操作,容器内部是无法操作的!
Dockerfile
Dockerfile 就是用来构建docker 镜像的构建文件! 命令脚本,先体验一下。
通过这个脚本可以生成镜像,镜像是一层一层的,脚本一个个的命令,每个命令都是一层。
#创建一个dockerfile文件 ,名字建议 dockerfile # 文件中的内容 指令 都是大写的 参数 [root@node1 docker-test-volume]# cat dockerfile1 FROM centos VOLUME ["volume01","volume02"] CMD echo "----end----" CMD /bin/bash
docker build -f /home/docker-test-volume/dockerfile1 -t semon/centos:1.0 .
这种方式我们未来使用的十分多,因为我们通常会构建自己的镜像!
加上构建镜像是没有挂载卷,要手动镜像挂载 -v 卷名:容器内路径!
数据卷容器
多个mysql同步数据!
# 创建3个容器 docker run -it --name docker01 6204f9d0a976 docker run -it --name docker02 --volumes-from docker01 6204f9d0a976 docker run -it --name docker03 --volumes-from docker01 6204f9d0a976
多个mysql实现数据共享
结论:
容器之间配置信息的传递,数据卷容器的生命周期一直持续到没有容器使用为止。
但是一旦你持久化到了本地, 这个时候,本地的数据是不会删除的。
DockerFile
dockerfile 是用来构建docker镜像的文件! 命令参数脚本!
构建步骤:
1.编写一个dockerfile文件
2.docker build 构建成一个镜像
3.docker run 启动镜像
4.docker push 发布镜像(docker hub 阿里云镜像仓库!)
DockerFile 指令
FROM #基础镜像, 一切从这里开始构建 MAINTAINER # 镜像是谁写的 姓名+邮箱 RUN # 镜像构建时需要运行的命令 ADD # 步骤 ,tomcat镜像 这个tomcat压缩包! 添加内容 WORKDIR # 镜像的工作目录 VOLUME # 挂载的目录 EXPOSE # 保留端口配置 CMD # 指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代 ENTRYPOINT # 指定这个容器启动的时候要运行的命令,可以追加命令 ONBUILD # 当构建一个被继承 dockerfile 这个时候就会运行ONBUILD 触发指令。 COPY # 类似ADD 将我们的文件拷贝到镜像中 ENV # 构建时设置环境变量。
实战测试 构建自己的centos
Docker Hub 中99% 镜像都是从这个基础镜像过来的
FROM scratch
构建自己的tomcat
docker 镜像发布的阿里云服务上
docker 网络
自定义网络
查看所有的docker网络
网络模式
brige: 桥接 docker默认 自己也使用这种
none : 不配置
host : 和宿主机共享网络
测试
# 我们直接启动的命令 --net bridge 也就是docker0 docker run -d -P --name tomcat01 --net bridge tomcat #自己创建网络 docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet [root@node1 ~]# docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet 81418c65f58c8e25b75dec2fb488ff57f9ffd2a4974b5a579ab7a30a574cea41 [root@node1 ~]# docker network ls NETWORK ID NAME DRIVER SCOPE e45daf867404 bridge bridge local 44921fd26c1b host host local 81418c65f58c mynet bridge local 2ca0b5f26d3c none null local
[root@node1 ~]# docker run -d -P --name tomcat-net-01 --net mynet tomcat 41bcc1f5d880ebfccee8162341a322da8b55d588eecebecb36d93544cfda4b90 [root@node1 ~]# docker run -d -P --name tomcat-net-02 --net mynet tomcat b162f55c30c942e8016c558bde0d68f4a4f1fdaeace7ede58f5a7d3d662734bb [root@node1 ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES b162f55c30c9 tomcat "catalina.sh run" 3 seconds ago Up 2 seconds 0.0.0.0:49157->8080/tcp tomcat-net-02 41bcc1f5d880 tomcat "catalina.sh run" 8 seconds ago Up 7 seconds 0.0.0.0:49156->8080/tcp tomcat-net-01
网络连通
# 测试 # 一个容器2个ip 地址 例如阿里云 公网 私网 [root@node1 ~]# docker network connect mynet tomcat01 [root@node1 ~]# docker network connect mynet tomcat02 [root@node1 ~]# docker network inspect mynet
实战:部署Redis集群
shell 脚本!
Docker Compose
Docker compose 来轻松高效管理容器,定义运行多个容器。
安装
sudo curl -L "https://get.daocloud.io/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose #授权 sudo chmod +x /usr/local/bin/docker-compose [root@node1 bin]# sudo chmod +x docker-compose [root@node1 bin]# docker-compose version docker-compose version 1.29.2, build 5becea4c docker-py version: 5.0.0 CPython version: 3.7.10 OpenSSL version: OpenSSL 1.1.0l 10 Sep 2019
测试 官方文档例子
地址 https://docs.docker.com/compose/gettingstarted/
python 应用,计数器,redis!
1、应用 app.py
2、Dockerfile 应用打包为镜像
3、Docker-compose yaml文件(定义整个服务,需要的环境,web,redis)
4、启动 docker-compose up
流程:
1、创建 网络
2、执行 yml文件
3、启动服务
yaml
#3层 version: '' #版本 services: # 服务 服务1: web #服务配置 images build network ..... 服务2 :redis ..... 服务3:.... #其他配置 网络/卷、全局规划 volumes: networks configs