赞
踩
docker思想来自于集装箱,docker通过隔离机制,可以将服务器利用到极致
- 传统虚拟机,是虚拟出一个硬件,运行一个完整的操作系统,然后在这个系统上安装和运行软件
- 容器内的应用直接运行在宿主机的内核,容器是没有自己的内核的,也没有虚拟我们的硬件,所以轻便
- 每个容器是互相隔离,每个容器都有一个属于自己的文件系统,互不影响
docker镜像好比是一个模板,可以通过这个模板创建容器,通过这个模板可以创建多个容器
Docker利用容器技术,独立运行一个或一组应用,通过镜像来创建
仓库是存放镜像的地方,仓库分为 私有仓库与公有仓库
环境准备
- centos7
- xshell连接服务器进行操作
# 1.安装依赖 yum install -y yum-utils device-mapper-persistent-data lvm2 # 2. 配置镜像 yum-config-manager \ --add-repo \ http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo # 更新软件包索引 yum makecache fast # 4. 安装docker相关依赖 yum -y install docker-ce docker-ce-cli containerd.io # 5. 启动docker systemctl start docker # 6. 运行一个hello,worild docker run heloo-world # 7. 查看下载的docker镜像 docker images # 卸载docker yum remove docker-ce docker-ce-cli containerd.io rm -rf /var/lib/docker
mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://jkotkvmy.mirror.aliyuncs.com"]
}
EOF
systemctl daemon-reload
systemctl restart docker
docker是一个Client-Server结构的系统,Docker的守护进程运行在主机上,通过Socket从客户端访问,DockerServer接受到Docker-Client的指令,就会执行这个命令
- Docker有着比虚拟机更少的抽象层
- Docker利用的是宿主机的内核,vm需要的是Guest OS
- 新建一个容器的时候,docker不需要像虚拟机一样重新加载一个操作系统,避免引导
docker version # 显示docker的版本信息
docker info # 显示docker的系统信息,包括镜像和容器的数量
docker 命令 --help # 帮助命令
帮助文档地址:https://docs.docker.com/engine/reference/commandline/docker/
[root@student_test server]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest feb5d9fea6a5 13 months ago 13.3kB
#解释
REPOSITORY 镜像的仓库源
TAG 镜像的标签
IMAGE ID 镜像的ID
CREATE 镜像的创建时间
SIZE 镜像的大小
# 可选项
-a --all # 列出所有镜像
-q --quiet # 只显示镜像的ID
[root@student_test server]# docker search mysql
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 13381 [OK]
phpmyadmin phpMyAdmin - A web interface for MySQL and M… 664 [OK]
bitnami/mysql Bitnami MySQL Docker Image 78 [OK]
# 可选项,通过搜索来过滤
--filter=starts=3000 搜索出来的镜像就是starts大于3000的
[root@student_test server]# docker search --filter=stars=3000 mysql
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 13381 [OK]
[root@student_test server]# docker search --filter=stars=5000 mysql
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 13381 [OK]
# 下载镜像 docker pull 镜像名:[tag] [root@student_test server]# docker pull mysql Using default tag: latest #如果不写tag,默认就是latest 最新版本 latest: Pulling from library/mysql 72a69066d2fe: Pull complete # 分层下载,docker images 核心,联合文件系统 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:e9027fe4d91c0153429607251656806cc784e914937271037f7738bd5 # 签名 Status: Downloaded newer image for mysql:latest docker.io/library/mysql:latest #真实地址 # docker pull mysql 等价于它 docker pull docker.io/library/mysql:latest # 指定版本下载 [root@student_test server]# 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
[root@student_test ]# docker rmi -f 镜像ID # 删除指定的镜像
[root@student_test ]# docker rmi -f 镜像ID 镜像ID 镜像ID # 删除多个镜像
[root@student_test ]# docker rmi -f $(docker images -aq) # 删除所有镜像
docker pull centos
docker run [可选参数] image # 参数说明 --name="NAME" 容器名字,用来区分容器 -d 后台方式运行 -it 使用交互方式运行,进入容器查看内容 -p 指定容器的端口 -p 8080:8080 -p 主机端口:容器端口 (常用) -p 容器端口 -p ip:主机端口:容器端口 -P 随机指定端口 # 测试,启动并进入容器 [root@student_test /]# docker run -it centos /bin/bash [root@4a689aa64511 /]# ls # centos容器内,基础版本,很多命令不完善 bin etc lib lost+found mnt proc run srv tmp var dev home lib64 media opt root sbin sys usr # 从容器退回主机 [root@4a689aa64511 /]# exit exit
# docker ps 命令
# 列出正在运行的容器
-a # 列出当前正在运行的容器,并显示历史运行的容器
-n=? # 显示最近创建的容器
-q # 只显示容器的编号
[root@student_test server]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4a689aa64511 centos "/bin/bash" 6 minutes ago Exited (0) 2 minutes ago beautiful_herschel
e34dd3bd2f5b feb5d9fea6a5 "/hello" 7 hours ago Exited (0) 7 hours ago hopeful_booth
414f6bd7732d feb5d9fea6a5 "/hello" 12 hours ago Exited (0) 12 hours ago zen_feistel
exit # 容器停止并退出
Ctrl+P+Q # 容器不停止退出
docker rm 容器id # 删除指定容器,不能删除正在运行的容器,强制删除 rm -f
docker rm -f $(docker ps -aq) # 删除所有容器
docker start 容器id # 启动容器
docker restart 容器id # 重启容器
docker stop 容器id # 停止容器
docker kill 容器id # 强制停止容器
# 命令 docker run -d 镜像名
[root@student_test /]# docker run -d centos
11138413d3d8310c5c00609796c5ac9210c1a8cf5b8ece0e533cb6d5b27ae8af
[root@student_test /]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
# 问题: docker ps 发现 centos停止了
# 常见的坑: docker 容器使用后台运行,就必须要有一个前台进程,docker发现没有应用,就会自动停止
# 容器启动后,发现自己没有提供服务,就会立刻停止,就是没有程序了
docker logs -f -t --tail 容器.没有日志
# 自己写一段shell脚本
[root@student_test /]# docker run -d centos /bin/bash -c "while true;do echo dsb;sleep 1;done"
5e5fc252da0f99f12cf44538cc22e17d9a64bdddbf562a6b393579a983686415
[root@student_test /]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5e5fc252da0f centos "/bin/bash -c 'while…" 4 seconds ago Up 4 seconds gracious_darwin
# 显示日志
-tf # 显示日志
--tail # 显示日志条数
[root@student_test /]# docker logs -f -t --tail 100 5e5fc252da0f
docker top 容器ID
root@student_test /]# docker top 5e5fc252da0f
UID PID PPID C STIME TTY
root 9663 9645 0 23:09 ?
root 10022 9663 0 23:13 ?
# 命令 docker inspect 容器ID # 测试 [root@student_test /]# docker inspect 5e5fc252da0f [ { "Id": "5e5fc252da0f99f12cf44538cc22e17d9a64bdddbf562a6b393579a983686415", "Created": "2022-10-24T15:09:05.475153779Z", "Path": "/bin/bash", "Args": [ "-c", "while true;do echo dsb;sleep 1;done" ], "State": { "Status": "running", "Running": true, "Paused": false, "Restarting": false, "OOMKilled": false, "Dead": false, "Pid": 9663, "ExitCode": 0, "Error": "", "StartedAt": "2022-10-24T15:09:05.680407261Z", "FinishedAt": "0001-01-01T00:00:00Z" }, "Image": "sha256:5d0da3dc976460b72c77d94c8a1ad043720b0416bfc16c52c45d4847e53fadb6", "ResolvConfPath": "/var/lib/docker/containers/5e5fc252da0f99f12cf44538cc22e17d9a64bdddbf562a6b393579a983686415/resolv.conf", "HostnamePath": "/var/lib/docker/containers/5e5fc252da0f99f12cf44538cc22e17d9a64bdddbf562a6b393579a983686415/hostname", "HostsPath": "/var/lib/docker/containers/5e5fc252da0f99f12cf44538cc22e17d9a64bdddbf562a6b393579a983686415/hosts", "LogPath": "/var/lib/docker/containers/5e5fc252da0f99f12cf44538cc22e17d9a64bdddbf562a6b393579a983686415/5e5fc252da0f99f12cf44538cc22e17d9a64bdddbf562a6b393579a983686415-json.log", "Name": "/gracious_darwin", "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": [ { "Name": "nofile", "Hard": 65535, "Soft": 65535 } ], "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/8662e6f29c99573f822c2213943fdd1706cfc7ac88017f09b35adca9a7282d8e-init/diff:/var/lib/docker/overlay2/9d0f40ef82a77d7f14a66f30f9909d053d82c2fe76eb86805b444906894b48c4/diff", "MergedDir": "/var/lib/docker/overlay2/8662e6f29c99573f822c2213943fdd1706cfc7ac88017f09b35adca9a7282d8e/merged", "UpperDir": "/var/lib/docker/overlay2/8662e6f29c99573f822c2213943fdd1706cfc7ac88017f09b35adca9a7282d8e/diff", "WorkDir": "/var/lib/docker/overlay2/8662e6f29c99573f822c2213943fdd1706cfc7ac88017f09b35adca9a7282d8e/work" }, "Name": "overlay2" }, "Mounts": [], "Config": { "Hostname": "5e5fc252da0f", "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/bash", "-c", "while true;do echo dsb;sleep 1;done" ], "Image": "centos", "Volumes": null, "WorkingDir": "", "Entrypoint": null, "OnBuild": null, "Labels": { "org.label-schema.build-date": "20210915", "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": "319ec876f19188d81b7e2dfceb539492de3116afb4fa257d0665fa131ee29bd7", "HairpinMode": false, "LinkLocalIPv6Address": "", "LinkLocalIPv6PrefixLen": 0, "Ports": {}, "SandboxKey": "/var/run/docker/netns/319ec876f191", "SecondaryIPAddresses": null, "SecondaryIPv6Addresses": null, "EndpointID": "2cf2fd5552787e6ad8de1f4f1d3448f11bdbef6e1615edd33a2735745c5de6c6", "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": "993f8a8f607b993ae9a532566790f27b173492b32cc35a19061f025aaaf2d93a", "EndpointID": "2cf2fd5552787e6ad8de1f4f1d3448f11bdbef6e1615edd33a2735745c5de6c6", "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 bashshell # 测试 [root@student_test /]# docker exec -it 5e5fc252da0f /bin/bash [root@5e5fc252da0f /]# ps -ef UID PID PPID C STIME TTY TIME CMD root 1 0 0 15:09 ? 00:00:00 /bin/bash -c while true;do ec root 2310 0 1 15:47 pts/0 00:00:00 /bin/bash root 2325 1 0 15:47 ? 00:00:00 /usr/bin/coreutils --coreutil root 2326 2310 0 15:47 pts/0 00:00:00 ps -ef # 方式2 docker attach 容器ID # 测试 [root@student_test /]# docker attach 5e5fc252da0f 正在执行的代码.... # docker exec # 进入容器后开启一个新的终端,可以在里面操作(常用) # docker attach # 进入容器正在执行的终端,不会启动新的进程
docker cp 容器ID:路径 宿主机目录 #查看当前主机目录下 [root@student_test home]# ls atguigu redset shutdown1 #进入容器内部 [root@student_test home]# docker attach d930206b4358 [root@d930206b4358 /]# cd /home/ [root@d930206b4358 home]# ls # 容器内新建一个文件 [root@d930206b4358 home]# touch test.java [root@d930206b4358 home]# exit exit [root@student_test home]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES [root@student_test home]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES d930206b4358 centos "/bin/bash" About a minute ago Exited (0) 18 seconds ago gifted_hofstadter # 将这个文件拷贝到主机 [root@student_test home]# docker cp d930206b4358:/home/test.java ./ [root@student_test home]# ls atguigu redset shutdown1 test.java # 拷贝是一个手动过程,未来使用 -v 卷的技术,可以实现互通
# 部署nginx 1. 搜索镜像 [root@student_test /]# docker search nginx 2. 下载镜像 [root@student_test /]# docker pull nginx 3. 运行测试 [root@student_test /]# docker run -d --name nginx01 -p 8080:80 nginx [root@student_test /]# curl localhost:8080 <!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> <p>If you see this page, the nginx web server is successfully installed and working. Further configuration is required.</p> <p>For online documentation and support please refer to <a href="http://nginx.org/">nginx.org</a>.<br/> Commercial support is available at <a href="http://nginx.com/">nginx.com</a>.</p> <p><em>Thank you for using nginx.</em></p> </body> </html>
# docker部署tomcat docker run -it --rm tomcat:9.0 # 我们启动容器是后台启动,停止容器后,容器还能找到, 而这个命令一般用来测试,用完即删 1. 下载 [root@student_test /]# docker pull tomcat Using default tag: latest latest: Pulling from library/tomcat 2. 启动容器 [root@student_test /]# docker run -d --name tomcat01 -p 8081:8080 tomcat 3. 测试访问 # 发现报404,进入容器查看,发现tomcat镜像是最小版 [root@student_test /]# docker exec -it tomcat01 /bin/bash root@12f88257f07e:/usr/local/tomcat# ls BUILDING.txt README.md conf temp CONTRIBUTING.md RELEASE-NOTES lib webapps LICENSE RUNNING.txt logs webapps.dist NOTICE bin native-jni-lib work root@12f88257f07e:/usr/local/tomcat# cd webapps root@12f88257f07e:/usr/local/tomcat/webapps# ls root@12f88257f07e:/usr/local/tomcat/webapps# # 工程目录内没有文件,将webapps.dist文件复制到webapps内即可
# 部署 ES+Kibana 1.下载并启动 [root@student_test /]# docker run -d --name ES01 -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms100m -Xmx300m" elasticsearch:7.6.0 #-e属性设置 #比如discovery.type设置为单节点模式 #注意:ES_JAVA_OPTS 是设置ES内存的 2. 测试 [root@student_test /]# curl localhost:9200 { "name" : "a787602ef1f7", "cluster_name" : "docker-cluster", "cluster_uuid" : "w001VcMQSFKLSo96BNneIA", "version" : { "number" : "7.6.0", "build_flavor" : "default", "build_type" : "docker", "build_hash" : "7f634e9f44834fbc12724506cc1da681b0c3b1e3", "build_date" : "2020-02-06T00:09:00.449973Z", "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" }
镜像是一种轻量级,可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码、运行时的库、环境变量和配置文件
如何得到镜像:
远程仓库取
另外的主机拷贝
自己制作
Union文件系统是一种分层,轻量级并且高性能的文件系统,它支持对文件系统的修改作为一场提交来以层层叠加,我们使用 docker pull 命令下载时所看到的一层层下载就是这个.Union同时可以将不同目录挂载到同一个虚拟文件系统下,Union文件系统是Docker镜像的基础,镜像可以通过分层进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像
特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件叠加起来,这样最终的文件系统会包含所有底层的文件和目录
docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统UnionFS
可以去下载一个镜像,观察日志的输出,可以看到是一层一层下载
思考:为什么Docker镜像采用这种分层结构呢
最大的好处,我觉得莫过于是资源共享,如有多个镜像从相同的Base镜像构建而来,那么宿主机只需要再磁盘上保留一份Base镜像,同时内存也只需要加载一份Base镜像,就可以为所有容器服务,镜像的每一层都可以被共享
特点
Docker镜像都是只读的,当容器启动时,一个新的可写层被加载到镜像的顶部,这一层就是容器层,容器之下都叫镜像层
docker commit 提交容器成为一个新的版本
docker commit -m="提交的描述信息" -a="作者" 容器ID 目标镜像名:[TAG]
测试
# 启动一个默认的tomcat
# 默认的tomcat webapps下没有文件
# 自己拷贝文件进去,重新打包
如果数据在容器内,那么容器删除,数据就会丢失.
容器之间有一个数据共享的技术,Docker容器中产生的数据同步到本地,简单来说就是一个目录的挂载,将容器内的目录挂载到本地
容器的持久化和同步操作,容器间也可以数据共享
命令挂载方式 docker run -it -v 主机目录:容器目录 #测试 [root@student_test ~]# docker run -it -v /home/ceshi:/home centos /bin/bash # 启动后,可以通过 docker inspect 容器名 | grep -A 10 Mounts 来查看 "Mounts": [ { "Type": "bind", "Source": "/home/ceshi", "Destination": "/home", "Mode": "", "RW": true, "Propagation": "rprivate" } ],
测试文件的同步
# 测试
容器停止后,在本机修改共享目录下的文件依然会同步到容器内
# 运行容器,需要数据挂载,启动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 # 查看所有卷的情况 [root@student_test data]# docker volume ls DRIVER VOLUME NAME local 844ced237db201903c160c994d99ed03499806be8e16f8fad8af41cecfe9dc2b # 这里发现,这种就是匿名挂载,我们 -v 只写了容器内的路径,没有写容器外路径 # 具名挂载 [root@student_test data]# docker run -d -P -v juming-nginx:/etc/nginx --name nginx01 nginx a0755b5217fba5f756227bf5577297683d4bd2ff86017cc6fba7767bfb439621 [root@student_test data]# docker volume ls DRIVER VOLUME NAME local juming-nginx # 通过 -v 卷名:容器内路径 # 查看一下这个卷
所有docker容器内的劵,没有目录指定情况下都是在 ‘/var/lib/docker/volumes/xxxxx/_data’
# 如何确定是具名挂载还是匿名挂载,还是指定路径挂载
-v 容器内路径 # 匿名挂载
-v 卷名:容器内路径 #具名挂载
-v /宿主机路径:容器内路径 #路径挂载
拓展:
# 通过 -v 容器内路径:ro rw 改变读写权限
ro #只读
rw #可读可写
# 一旦设置了容器的权限,容器对我们挂载出来的内容就有限制了
docker run -d -P -v juming-nginx:/etc/nginx:ro nginx
docker run -d -P -v juming-nginx:/etc/nginx:rw nginx
# ro 说明只能通过宿主机来操作
Dockerfile 就是用来构建docker镜像的构建文件
通过这个脚本可以生成镜像,镜像是一层一层的,脚本一个一个命令,每个命令都是一层
# 创建一个dockerfile文件
# 文件中的内容
FROM centos
VOLUME ["volume01","volume02"]
CMD echo "---end----"
CMD /bin/bash
通过dockerfile创建一个镜像
# 启动两个容器,用之前创建的镜像
在centos01创建文件
启动centos02,并在centos02查看
通过–volumes-from 可以实现容器之间数据共享
# 删除centos01后,centos02内的test文件依旧可以访问
# --volumes-from 类似于拷贝的一个概念
多个mysql实现数据共享
# docker run -d -p 3310:3306 -v /etc/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
# docker run -d -p 3310:3306 -e MYSQL_ROOT_PASSWORD=123456 --name mysql02 --volumes-from mysql01 mysql:5.7
# 这个时候可以实现两个容器数据同步
结论:
容器之间配置信息的传递,数据卷的生命周期一直持续到没有容器使用为止
一旦持久化到了本地,这个时候,本地的数据是不会删除的
dockerfile 用来构建镜像的文件,命令参数脚本
构建步骤:
1. 编写一个dockerfile文件
2. docker build 构建出一个镜像
3. docker run 运行镜像
4. docker push 发布镜像(dockerhub,阿里云镜像仓库)
基础知识:
Dockerfile: 构建文件,定义了一切的步骤,源代码
DockerImages: 通过DockerFile构建成的镜像,最终发布和运行的产品
Docker容器: 容器就是镜像运行起来提供服务
# FROM 基础镜像,一切从这里开始构建 # MAINTAINER 镜像是谁写的,姓名+邮箱 # RUN 镜像构建时运行的命令 # ADD 步骤,如要做tomcat镜像,就要添加tomcat压缩包 # WORKDIR 镜像的工作目录 # VOLUME 容器卷,挂载的目录 # EXPOSE 指定暴露端口 # CMD 指定镜像运行的时候运行的命令,只有最后一个会生效,可被替代 # ENTRYPOINT 指定镜像运行的时候运行的命令,可以追加命令 # ONBUILD 当构建一个被继承的DockerFILE,这个时候就会运行 -ONBUILD,触发指令 # COPY 类似于ADD,将文件拷贝到镜像中 # ENV 构建时设置环境变量
# 创建一个自己的Centos FROM centos:7 # 这里需指定跟本机版本的,最新的8,使用yum命令会报错 MAINTAINER yzs<3131445883@qq.com> ENV mypath /usr/local WORKDIR $mypath RUN yum -y install vim RUN yum -y install net-tools EXPOSE 80 CMD /bin/bash # 通过这个文件构建镜像 docker build -f centos_dockerfile -t mycentos:1.0 . # 启动这个镜像 [root@student_test dockerfile]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE mycentos 1.0 17d8af68e551 5 minutes ago 626MB nginx latest 605c77e624dd 10 months ago 141MB tomcat latest fb5657adc892 10 months ago 680MB mysql 5.7 c20987f18b13 10 months ago 448MB centos 7 eeb6ee3f44bd 13 months ago 204MB [root@student_test dockerfile]# docker run -it 17d8af68e551
我们可以列出镜像的变更历史
# CMD 和 ENTRYPOINT 的区别
1. CMD是替换,在执行 docker run的时候后面跟的命令会替换掉CMD定义的,例 docker run -it images -l
2. ENTRYPOINT是追加,在执行 docker run的时候后面跟的命令会追加进ETNRYPOINT定义的,例 docker run -it images -l
# 1.定义dockerfile文件 [root@student_test dockerfile]# cat Dockerfile FROM centos:7 MAINTAINER yzs<3131445883@qq.com> COPY readme.txt /usr/lcoal ADD jdk-8u231-linux-x64.tar.gz /usr/local ADD apache-tomcat-8.5.57.tar.gz /usr/local WORKDIR /usr/local/ ENV JAVA_HOME=/usr/local/jdk1.8.0_231/ ENV CLASSPATH=$JAVA_HOME/lib ENV PATH=$PATH;$JAVA_HOME/bin RUN yum -y install vim EXPOSE 8080 CMD /usr/local/apache-tomcat-8.5.57/bin/startup.sh && tail -f /usr/local/apache-tomcat-8.5.57/logs/catalina.out # 2. 编译 [root@student_test dockerfile]# docker build -t mytomcat . # 3. 运行 [root@student_test dockerfile]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE mytomcat latest 558e9c60c4c0 7 seconds ago 860MB mycentos 1.0 17d8af68e551 About an hour ago 626MB nginx latest 605c77e624dd 10 months ago 141MB tomcat latest fb5657adc892 10 months ago 680MB mysql 5.7 c20987f18b13 10 months ago 448MB centos 7 eeb6ee3f44bd 13 months ago 204MB [root@student_test dockerfile]# docker run -d -p 9090:8080 -v /home/dockerfile/test:/usr/local/apache-tomcat-8.5.57/webapps/ 558e9c60c4c0
[root@student_test ~]# 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@student_test ~]# docker push mytomcat Using default tag: latest The push refers to repository [docker.io/library/mytomcat] 0819256cb14e: Preparing 4f79a941deda: Preparing 89506895e1ce: Preparing b1f1129f0cd7: Preparing 174f56854903: Preparing denied: requested access to the resource is denied # push失败 [root@student_test ~]# docker push axxbox/mytomcat:1.0 The push refers to repository [docker.io/axxbox/mytomcat] 0819256cb14e: Pushing 79.03MB/238.4MB 4f79a941deda: Pushing 15.09MB 89506895e1ce: Pushing 124.2MB/402.7MB b1f1129f0cd7: Pushing 2.048kB 174f56854903: Pushing 17.92MB/203.9MB # 构建镜像是指定镜像名为 Dockerhub_UserName/image_name:tag
docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/yzs_images/yzs_test:[镜像版本号]
docker push registry.cn-hangzhou.aliyuncs.com/yzs_images/yzs_test:[镜像版本号]
三个网络地址
[root@student_test ~]# docker exec -it tomcat01 ping tomcat02 ping: tomcat01: Name ot service not Konw # 如何通过名字来访问容器 # 通过--link解决 [root@student_test ~]# docker run -it --name centos01 --link tomcat01 eeb6ee3f44bd [root@student_test ~]# docker exec -it centos01 ping tomcat01 PING tomcat01 (172.17.0.2) 56(84) bytes of data. 64 bytes from tomcat01 (172.17.0.2): icmp_seq=1 ttl=64 time=0.105 ms 64 bytes from tomcat01 (172.17.0.2): icmp_seq=2 ttl=64 time=0.091 ms # 反向ping,由 tomcat01 ping centos01 是ping不通的 # 原理探究,通过查看centos01的host文件发现 [root@student_test ~]# docker exec -it centos01 cat /etc/hosts 127.0.0.1 localhost ::1 localhost ip6-localhost ip6-loopback fe00::0 ip6-localnet ff00::0 ip6-mcastprefix ff02::1 ip6-allnodes ff02::2 ip6-allrouters 172.17.0.2 tomcat01 d0276e2cd28d 172.17.0.4 6c62ab7c1fed # --link 操作就是在hosts文件中增加了一个地址对应,真是环境内,已经不建议使用--link # docker0问题:不支持容器名连接访问
查看所有的docker 网络
网络模式:
- bridge: 桥接(默认,自定义也用)
- none: 不配置网络
- host: 主机模式,和宿主局共享网络
- container: 容器网络连通(用得少,局限大)
# 我们默认直接启动命令用的是 --net bridge ,这个就是docker0 docker run -d -P --name tomcat01 tomcat docker run -d -P --net bridge --name tomcat01 tomcat # docker0 特点: 默认,域名不能访问,--link可以打开连接 # 自定义一个网络 # --driver bridge # --subnet [root@student_test ~]# docker network create --driver bridge --subnet 172.16.0.0/16 --gateway 172.16.0.1 mynet 0cf3d1091367003e0da56b8fe2533e5eb0b9da08975550e72c90b3dc294d58b4 [root@student_test ~]# docker network ls NETWORK ID NAME DRIVER SCOPE f9084b1d5afd bridge bridge local 33362e1286a8 host host local 602074b40a59 jms_net bridge local 0cf3d1091367 mynet bridge local a9ddbf4ec3aa none null local
启动两个容器设置网络为自定义的网络 [root@student_test ~]# docker run -it --name centos02 --net mynet centos:7 WARNING: IPv4 forwarding is disabled. Networking will not work. # 进行测试 [root@student_test ~]# docker exec -it centos01 ping centos02 PING centos02 (172.16.0.3) 56(84) bytes of data. 64 bytes from centos02.mynet (172.16.0.3): icmp_seq=1 ttl=64 time=0.094 ms ^C --- centos02 ping statistics --- 1 packets transmitted, 1 received, 0% packet loss, time 0ms rtt min/avg/max/mdev = 0.094/0.094/0.094/0.000 ms [root@student_test ~]# docker exec -it centos02 ping centos01 PING centos01 (172.16.0.2) 56(84) bytes of data. 64 bytes from centos01.mynet (172.16.0.2): icmp_seq=1 ttl=64 time=0.045 ms ^C --- centos01 ping statistics --- 1 packets transmitted, 1 received, 0% packet loss, time 0ms rtt min/avg/max/mdev = 0.045/0.045/0.045/0.000 ms # 使用自定义网络,也能达到--link的效果
mynet下新添加的两个ip,就是新增的两台容器
# 测试,打通tomcat01 到 mynet
#新增容器 tomcat01并打通到mynet
[root@student_test ~]# docker run -d -P --name tomcat01 tomcat
WARNING: IPv4 forwarding is disabled. Networking will not work.
3abc1c5a2b22acaa4d3bda973fa99cac0aedc877fe0962f3742fed76291ffaf1
[root@student_test ~]#
[root@student_test ~]# docker network connect mynet tomcat01
# 连通之后就是将tomcat01 取到了 mynet网络下
# 一个容器两个ip
# 连通
[root@student_test ~]# docker exec -it centos01 ping tomcat01
PING tomcat01 (172.16.0.4) 56(84) bytes of data.
64 bytes from tomcat01.mynet (172.16.0.4): icmp_seq=1 ttl=64 time=0.097 ms
64 bytes from tomcat01.mynet (172.16.0.4): icmp_seq=2 ttl=64 time=0.063 ms
64 bytes from tomcat01.mynet (172.16.0.4): icmp_seq=3 ttl=64 time=0.069 ms
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。