docker概述
docker为什么出现?
一款产品:开发--上线 两套环境, 两套配置
开发 和 运维 问题:在我的电脑上可以运行,版本更新,导致服务不可用!对于运维来说,考验十分的大
开发即是运维的情况下更是如此,每一个机器都要部署环境,浪费时间和人力,容器化,项目带着环境来打包,配置很麻烦,也有部分不能跨平台比如开发win,打包到linux
传统思想 : 开发jar 运维来做
现在 : 开发打包部署上线,一套流程做完
为什么docker厉害?
java --apk --发布 --- 张三使用 apk --- 安装即可用!
java ---jar ---打包项目带上环境(镜像) --- (docker仓库镜像)--下载开发人员上传的镜像 -- 直接就可以运行
docker根据以上的问题给出了解决方案
docker的思想来自于集装箱
JRE - -多个应用---原来是交叉的
docker的核心思想 : 隔离,打包装箱,每个箱子都是互相隔离的
Docker通过隔离机制,让服务器更好的发挥
本质 : 所有的技术都是出现了问题,我们需要去解决
Docker的历史和作用
2010,几个搞it的年轻人,最开始的时候并不叫 Docker dotcloud
做一些pass的云计算服务,LXC有关的容器技术
他们将自己的技术(容器化技术)同一的命名为 Docker
应为刚诞生所以没什么基础,于是乎领导人们选择了将Docker的源码开放
开源之后的Docker一瞬间就火了
为什么Docker火起来了,应为相比虚拟机,Docker要更加的轻量
虚拟机 :
一般都是再win中安装Vmware 通过这个技术我们可以虚拟出来一台电脑或者是多台电脑,但是占用过大,随便一个镜像就是十几个g,十分的笨重
虚拟机技术的缺点:
- 资源占用十分多
- 开机关机需要时间
- 运行完整的操作系统,还要安装运行软件
Docker :
相比之下Docker就显得格外的小巧。隔离,镜像(核心的环境4m+jdk+mysql)需要的时候我们只需要去运行镜像就可以了,大大提升了灵活性
Docker技术 :
- 运行在操作系统之上,容器没有内核,也不用虚拟硬件
- 每个容器是互相隔离的,又属于自己的文件系统,不会互相的影响
了解了Docker的作用,可以知道我们程序员掌握Docker是十分的必要的
社区文档
Docker的社区文档是十分的详细的
文档连接 : https://docs.docker.com/
Docker仓库地址 : https://www.docker.com/products/docker-hub
DevOps(开发和运维)
他的宗旨是什么
应用更快速的交付和部署
- 传统 : 一堆帮助文档,安装程序
- Docker:打包镜像发布测试,一键运行
更便捷的升级和扩容
使用了Docker之后,我们部署的应用和搭积木一样
项目打包成一个镜像,扩展到服务器A,服务器B
更简单的系统运维
在容器化之后,我们的开发,测试环境,高度的一致
更高效的计算资源利用
Docker是内核级别的虚拟化,可以在一个物理机上运行很多的容器实例
Docker安装
Docker的组成结构
镜像:
Docker的镜像就像是一个模板,可以荣国这个模板来创建容器服务
例子:
tomcat ====》run ===》tomcat01容器(提供服务)
我们可以同过镜像创建多个容器(最终服务运行或者是项目运行都是在容器中的)
容器:
Docker利用容器技术,独立运行一个或者一组应用,通过容器来创建的
启动,停止,删除,等基本命令
目前我们可以把容器理解为一个建议的linux系统,项目都是跑在系统上的
仓库:
仓库就是存放镜像的地方
有私有的有共有的
DockerHub
阿里云等等厂商都有镜像服务
安装Docker
环境准备
- 需要会一点点linx的基础
- linux : CentOS7
- 使用连接工具连接服务器操作
确认系统环境
[root@iZwz90ps06ioyada63oiwiZ ~]# uname -r 3.10.0-957.21.3.el7.x86_64
[root@iZwz90ps06ioyada63oiwiZ ~]# cat /etc/os-release NAME="CentOS Linux" VERSION="7 (Core)" ID="centos" ID_LIKE="rhel fedora" VERSION_ID="7" PRETTY_NAME="CentOS Linux 7 (Core)" ANSI_COLOR="0;31" CPE_NAME="cpe:/o:centos:centos:7" HOME_URL="https://www.centos.org/" BUG_REPORT_URL="https://bugs.centos.org/" CENTOS_MANTISBT_PROJECT="CentOS-7" CENTOS_MANTISBT_PROJECT_VERSION="7" REDHAT_SUPPORT_PRODUCT="centos" REDHAT_SUPPORT_PRODUCT_VERSION="7"
官方文档可以看到要求:
我们如果是用的linxu系统是 CentOS 那么必须是 7 版本以上才支持的
如果安装装过的话,建议删除之前的旧版本的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 \ http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo #4 安装docker相关的内容 yum install docker-ce docker-ce-cli containerd.io #5 安装之后测试是否安装成功 systemctl start docker #6查看docker的版本号 docker version
之后查看我们docker的版本即可
#7 运行docker的helloword docker run hello-world
# 8 如何查看docker下载的镜像呢? docker images # 就可以查看docker下载的位置了
了解 如何卸载docker
#1 卸载docker的相关内容 yum remove docker-ce docker-ce-cli containerd.io #2 卸载docker的和我们下载容器 sudo rm -rf /var/lib/docker sudo rm -rf /var/lib/containerd # /var/lib/docker 是 docker的默认工作路径
提升效率
阿里云的容器加速
- 登录阿里云找到容器服务
- 找到镜像加速地址
- 配置使用
sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://v3ev0217.mirror.aliyuncs.com"] } EOF sudo systemctl daemon-reload sudo systemctl restart docker
回顾hello world 的完整过程
run 的过程分析图
底层原理
docker是做什么工作的?
Docker是一个 Client server的系统,Docker是守护进程运行在主机上。通过socket从客户端访问
DockerServer接受到Docker-Client的指令,就会去执行这个命令。
Docker为什么比虚拟机快
- Docker有着比虚拟机更少的抽象层
- Docker利用的是主机的内核,vm需要的是Guset OS
- 所以说新建一个容器的时候,docker不需要想虚拟机一样重新加一个操作系统的内核,避免引导,
- 虚拟机是加载 Guest OS 分钟级别的,
- 而docker是利用主机的操作系统,省略了这个复杂的加载过程,秒级别
现在的docker是都支持的
不只支持 linux,Mac OS, windows都支持
之后又docker的使用经验之后我们回过头来再看理论,就会理解的很清晰了
Docker的常用命令
帮助命令
docker version #查看docker的版本信息 docker info #显示docker的系统信息,包括容器和镜像的数量 docker --help #显示docker的所有命令
帮助文档的地址 :
https://docs.docker.com/engine/reference/run/
镜像命令
Docker imeages #查看所有本地的主机上有的镜像
[root@iZwz90ps06ioyada63oiwiZ ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE hello-world latest feb5d9fea6a5 12 days ago 13.3kB #解释 REPOSITORY 镜像的仓库源 TAG 镜像的标签 IMAGE ID 镜像的id CREATED 镜像的创建时间 SIZE 镜像的储存大小 #可选项 -a -all #列出所有的镜像 -q --quiet #只显示镜像的id
Docker pull 下载
#下载内容 ,默认的tag 是 latest #可以按照版本号 ,也可以直接用mysql下载版本 [root@iZwz90ps06ioyada63oiwiZ ~]# docker pull mysql:5.7 5.7: Pulling from library/mysql 07aded7c29c6: Already exists #分段的下载,联合文件系统,不用重复下载,可以共用重复的部分 f68b8cbd22de: Already exists 30c1754a28c4: Already exists 1b7cb4d6fe05: Already exists 79a41dc56b9a: Already exists 00a75e3842fb: Already exists b36a6919c217: Already exists 5e11fe494f45: Pull complete 9c7de1f889a7: Pull complete cf6a13d05a76: Pull complete fc5aa81f393a: Pull complete Digest: sha256:360c7488c2b5d112804a74cd272d1070d264eef4812d9a9cc6b8ed68c3546189 Status: Downloaded newer image for mysql:5.7 docker.io/library/mysql:5.7
删除命令
docker rmi -f 9f35042c6a98 #根据 镜像id 删除docker镜像 docker rmi -f images id images id images id #批量删除docker镜像 docker rmi -f $(docker images -aq) # 删除全部镜像
容器命令
说明:我们有了镜像才可以创建容器,以linux为例子,创造一个CentOS的容器
来测试学习
docker pull centos
新建容器并且启动
docker run [可选参数] image #参数说明 --name = "name" 容器名字, tomcat 1 ,tomcat 2来区分容器 -d 后台的方式运行 -it 使用交互方式运行 ,进入容器查看内容 -p 指定容器的端口 -p 8080:8080 -p ip :主机端口:容器端口 -p 主机端口 : 容器端口(常用) -p 容器端口 -p 随机指定端口 #测试,并且启动进入容器 [root@iZwz90ps06ioyada63oiwiZ ~]# docker run -it centos /bin/bash [root@aa1a02ed3f51 /]# ls bin etc lib lost+found mnt proc run srv tmp var dev home lib64 media opt root sbin sys usr #推出容器查看 [root@iZwz90ps06ioyada63oiwiZ /]# ls bin dev home lib64 media mynacos nginxWebdata patch project run srv tmp var boot etc lib lost+found mnt myredis opt proc root sbin sys usr www
列出所有运行的容器
docker ps #列出当前正在运行的容器 -a #列出当前正在运行的容器+带出历史运行过的内容 -n = ? #显示最近创建的容器 -q #只显示容器的编号 #可以看到我们之前使用的 helloworld 和 centos 容器 [root@iZwz90ps06ioyada63oiwiZ /]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES aa1a02ed3f51 centos "/bin/bash" 3 minutes ago Exited (0) 2 minutes ago upbeat_matsumoto 0341862ece26 feb5d9fea6a5 "/hello" 8 hours ago Exited (0) 8 hours ago clever_jennings
退出容器
exit #直接容器停止并且推出 Ctrl + p + q #容器不停止 推出
删除容器
docker rm 容器id # 删除指定容器,不能删除正在运行的容器 docker rm -f $(docker ps -aq) #删除所有的容器 docker ps -a|xargs docker rm #也可以删除所有的容器 [root@iZwz90ps06ioyada63oiwiZ /]# docker rm -f $(docker ps -aq) aa1a02ed3f51 0341862ece26
启动和停止容器
docker start 容器id #启动容器 docker restart 容器id #重启容器 docker stop 容器id #关闭容器 docker kill 容器id #强制关闭当前的容器
常用的其他命令
后台启动容器
#命令 docker run -d 镜像! #问题 docker ps 发现centos停止了 #常见的坑 docker 容器使用后台运行,就必须要有一个前台的进程,docker发现没有前台的应用,就会自动停止 #nginx 容器启动后,发现自己没有提供服务,就会立刻停止,就是没有程序了
查看日志
docker logs -f -t --tail 容器 #自己编写一段shell脚本 while true; do echo hyc;sleep 1;done #查看运行是否成功 [root@iZwz90ps06ioyada63oiwiZ /]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 754a5ea93b0c centos "/bin/sh -c 'while t…" 5 seconds ago Exited (1) 5 seconds ago sad_morse #显示日志 docker logs 显示全部日志 docker logs -tf cb8836c6fe21 按条件显示日志,之后一直显示 docker logs -tf --tail 10 cb8836c6fe2 --tf #显示日志 --tail number #显示日志的条数
查看容器中的进程信息
[root@iZwz90ps06ioyada63oiwiZ /]# docker top cb8836c6fe21 UID PID PPID C STIME TTY TIME CMD root 3490 3472 0 23:32 ? 00:00:00 /bin/sh -c while true;do echo hyc;sleep 1;done root 4994 3490 0 23:39 ? 00:00:00 /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep 1
查看镜像的元数据
#命令 查看 docker inspect cb8836c6fe21 [ { "Id": "cb8836c6fe217ecab4ba2c0fa5f3d83ecd298c09f26aed3f2024062b0191bfcf", "Created": "2021-10-06T15:32:31.74201481Z", "Path": "/bin/sh", "Args": [ "-c", "while true;do echo hyc;sleep 1;done" ], "State": { "Status": "running", "Running": true, "Paused": false, "Restarting": false, "OOMKilled": false, "Dead": false, "Pid": 3490, "ExitCode": 0, "Error": "", "StartedAt": "2021-10-06T15:32:32.049192513Z", "FinishedAt": "0001-01-01T00:00:00Z" }, "Image": "sha256:5d0da3dc976460b72c77d94c8a1ad043720b0416bfc16c52c45d4847e53fadb6", "ResolvConfPath": "/var/lib/docker/containers/cb8836c6fe217ecab4ba2c0fa5f3d83ecd298c09f26aed3f2024062b0191bfcf/resolv.conf", "HostnamePath": "/var/lib/docker/containers/cb8836c6fe217ecab4ba2c0fa5f3d83ecd298c09f26aed3f2024062b0191bfcf/hostname", "HostsPath": "/var/lib/docker/containers/cb8836c6fe217ecab4ba2c0fa5f3d83ecd298c09f26aed3f2024062b0191bfcf/hosts", "LogPath": "/var/lib/docker/containers/cb8836c6fe217ecab4ba2c0fa5f3d83ecd298c09f26aed3f2024062b0191bfcf/cb8836c6fe217ecab4ba2c0fa5f3d83ecd298c09f26aed3f2024062b0191bfcf-json.log", "Name": "/wizardly_hopper", "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/db5602f161d4930ca2f6f2d70eaddf29fb5daf635fa1307c9f3f9ee559ca7c50-init/diff:/var/lib/docker/overlay2/c57ecea0403cf58cf7c21ca1f4db2a1a84dadf594ceccd5560466191cfc22ec8/diff", "MergedDir": "/var/lib/docker/overlay2/db5602f161d4930ca2f6f2d70eaddf29fb5daf635fa1307c9f3f9ee559ca7c50/merged", "UpperDir": "/var/lib/docker/overlay2/db5602f161d4930ca2f6f2d70eaddf29fb5daf635fa1307c9f3f9ee559ca7c50/diff", "WorkDir": "/var/lib/docker/overlay2/db5602f161d4930ca2f6f2d70eaddf29fb5daf635fa1307c9f3f9ee559ca7c50/work" }, "Name": "overlay2" }, "Mounts": [], "Config": { "Hostname": "cb8836c6fe21", "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 hyc;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": "7e30f1e5819c55f424a9444110159f16e04b63b5e5a4e53146eece8e4a8df0f3", "HairpinMode": false, "LinkLocalIPv6Address": "", "LinkLocalIPv6PrefixLen": 0, "Ports": {}, "SandboxKey": "/var/run/docker/netns/7e30f1e5819c", "SecondaryIPAddresses": null, "SecondaryIPv6Addresses": null, "EndpointID": "3e938d5faea175bc21e47cbc812e2157a9853ade29723ce12b6114c99637bb86", "Gateway": "172.18.0.1", "GlobalIPv6Address": "", "GlobalIPv6PrefixLen": 0, "IPAddress": "172.18.0.2", "IPPrefixLen": 16, "IPv6Gateway": "", "MacAddress": "02:42:ac:12:00:02", "Networks": { "bridge": { "IPAMConfig": null, "Links": null, "Aliases": null, "NetworkID": "cedc24b7c89ecc2306b4f241d9a60b0a1b1246a8ce98c9013432c67af21785f6", "EndpointID": "3e938d5faea175bc21e47cbc812e2157a9853ade29723ce12b6114c99637bb86", "Gateway": "172.18.0.1", "IPAddress": "172.18.0.2", "IPPrefixLen": 16, "IPv6Gateway": "", "GlobalIPv6Address": "", "GlobalIPv6PrefixLen": 0, "MacAddress": "02:42:ac:12:00:02", "DriverOpts": null } } } } ]
进入容器之后,修改一些配置
我们容器通长使用后台的方式运行 需要进入容器 修改一些配置 #命令 [root@iZwz90ps06ioyada63oiwiZ /]# docker ps -a #新建一个交互命令行 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES cb8836c6fe21 centos "/bin/sh -c 'while t…" 13 minutes ago Up 13 minutes wizardly_hopper [root@iZwz90ps06ioyada63oiwiZ /]# docker exec -it cb8836c6fe21 /bin/bash [root@cb8836c6fe21 /]# ps -ef UID PID PPID C STIME TTY TIME CMD root 1 0 0 15:32 ? 00:00:00 /bin/sh -c while true;do echo hyc;sleep 1;done root 986 0 0 15:48 pts/0 00:00:00 /bin/bash root 1014 1 0 15:48 ? 00:00:00 /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin root 1015 986 0 15:48 pts/0 00:00:00 ps -ef [root@cb8836c6fe21 /]# #方式二 docker attach 容器id #测试 进入之后会显示正在执行的 代码 #docker exec 进入容器开启一个新的终端。可以再里面操作(常用) #docker attach 进入容器正砸执行的终端
从docker中取出文件
#创建文件 [root@iZwz90ps06ioyada63oiwiZ dockerTest]# touch athyc.java [root@iZwz90ps06ioyada63oiwiZ dockerTest]# ls athyc.java hyc.java test.java [root@iZwz90ps06ioyada63oiwiZ dockerTest]# docker attach bcf5c1ea447c You cannot attach to a stopped container, start it first [root@iZwz90ps06ioyada63oiwiZ dockerTest]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES bcf5c1ea447c centos "/bin/bash" 5 minutes ago Exited (0) 4 minutes ago cool_ishizaka 63184e5cad4d centos "/bin/bash" 8 minutes ago Exited (0) 6 minutes ago jovial_cori #启动容器 [root@iZwz90ps06ioyada63oiwiZ dockerTest]# docker start bcf5c1ea447c bcf5c1ea447c [root@iZwz90ps06ioyada63oiwiZ dockerTest]# docker start bcf5c1ea447c /bin/bash bcf5c1ea447c Error response from daemon: No such container: bin/bash Error: failed to start containers: /bin/bash #进入命令行 [root@iZwz90ps06ioyada63oiwiZ dockerTest]# docker attach bcf5c1ea447c [root@bcf5c1ea447c /]# ls bin etc lib lost+found mnt proc run srv tmp var dev home lib64 media opt root sbin sys usr [root@bcf5c1ea447c /]# cd /home #创建文件 [root@bcf5c1ea447c home]# touch someone.java [root@bcf5c1ea447c home]# ls someone.java test.java [root@bcf5c1ea447c home]# exit exit #从docker中复制文件到主机文件夹 [root@iZwz90ps06ioyada63oiwiZ dockerTest]# docker cp bcf5c1ea447c:/home/someone.java /dockerTest/ [root@iZwz90ps06ioyada63oiwiZ dockerTest]# ls athyc.java hyc.java someone.java test.java
小结
日常使用命令大全
attach Attach local standard input, output, and error streams to a running container #当前shell下 attach连接指定运行的镜像 build Build an image from a Dockerfile # 通过Dockerfile定制镜像 commit Create a new image from a container's changes #提交当前容器为新的镜像 cp Copy files/folders between a container and the local filesystem #拷贝文件 create Create a new container #创建一个新的容器 diff Inspect changes to files or directories on a container's filesystem #查看docker容器的变化 events Get real time events from the server # 从服务获取容器实时时间 exec Run a command in a running container # 在运行中的容器上运行命令 export Export a container's filesystem as a tar archive #导出容器文件系统作为一个tar归档文件[对应import] history Show the history of an image # 展示一个镜像形成历史 images List images #列出系统当前的镜像 import Import the contents from a tarball to create a filesystem image #从tar包中导入内容创建一个文件系统镜像 info Display system-wide information # 显示全系统信息 inspect Return low-level information on Docker objects #查看容器详细信息 kill Kill one or more running containers # kill指定docker容器 load Load an image from a tar archive or STDIN #从一个tar包或标准输入中加载一个镜像[对应save] login Log in to a Docker registry # logout Log out from a Docker registry logs Fetch the logs of a container pause Pause all processes within one or more containers port List port mappings or a specific mapping for the container ps List containers pull Pull an image or a repository from a registry push Push an image or a repository to a registry rename Rename a container restart Restart one or more containers rm Remove one or more containers rmi Remove one or more images run Run a command in a new container save Save one or more images to a tar archive (streamed to STDOUT by default) search Search the Docker Hub for images start Start one or more stopped containers stats Display a live stream of container(s) resource usage statistics stop Stop one or more running containers tag Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE top Display the running processes of a container unpause Unpause all processes within one or more containers update Update configuration of one or more containers version Show the Docker version information wait Block until one or more containers stop, then print their exit codes
练习
nginx
docker安装nginx
#1, 搜索镜像 search 建议去docker hub 上搜索可以看到详细信息 docker search nginx #2 拉取镜像 pull 下载镜像 docker pull nginx #3 运行测试 #使用参数 #-d 后台运行 # --name 给容器名字 # -p 宿主机端口:容器端口 [root@iZwz90ps06ioyada63oiwiZ ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES [root@iZwz90ps06ioyada63oiwiZ ~]# docker run -d --name nginx01 -p 3344:80 nginx 30361d53c7276f50adecbef37a56865b9858a0b553efa7f33689c8c9f16d927e [root@iZwz90ps06ioyada63oiwiZ ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 30361d53c727 nginx "/docker-entrypoint.…" 30 seconds ago Up 30 seconds 0.0.0.0:3344->80/tcp nginx01 [root@iZwz90ps06ioyada63oiwiZ ~]# curl localhost:3344 #测试通过,进入查看配置,之后停止容器 [root@iZwz90ps06ioyada63oiwiZ ~]# curl localhost:3344 <!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> [root@iZwz90ps06ioyada63oiwiZ ~]# docker exec -it nginx01 /bin/bash root@30361d53c727:/# ls bin boot dev docker-entrypoint.d docker-entrypoint.sh etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var root@30361d53c727:/# whereis nginx nginx: /usr/sbin/nginx /usr/lib/nginx /etc/nginx /usr/share/nginx root@30361d53c727:/# cd /etc/nginx root@30361d53c727:/etc/nginx# ls conf.d fastcgi_params mime.types modules nginx.conf scgi_params uwsgi_params root@30361d53c727:/etc/nginx# exit exit [root@iZwz90ps06ioyada63oiwiZ ~]# ls install.sh [root@iZwz90ps06ioyada63oiwiZ ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 30361d53c727 nginx "/docker-entrypoint.…" 7 minutes ago Up 7 minutes 0.0.0.0:3344->80/tcp nginx01 [root@iZwz90ps06ioyada63oiwiZ ~]# docker stop 30361d53c727 30361d53c727
端口暴露的概念
思考:是不是我们每次创建一个nginx容器部署点东西,都需要去修改配置,这显然很耗时间,那么我们 需要怎么做呢, -v 数据卷容器,可以解决,
tomcat
docker 安装 tomcat
#官方的实例 用完就会删除, docker run -it --rm tomcat:9.0 #我们之前启动的都是后台,停止了容器之后,后台还是可以查到,docker run -it --rm一般用来测试,用完就会自动删除 #下载启动 docker pull tomcat:9.0 #启动运行 docker run -d -p 3355:8080 --name tomcat01 tomcat #发现可以访问但是没有内容,这是为什么呢,应为下载的tomcat是阉割版本,webapps下是空的所有没有 root@3fba46045c12:/usr/local/tomcat# ls BUILDING.txt LICENSE README.md RUNNING.txt conf logs temp webapps.dist CONTRIBUTING.md NOTICE RELEASE-NOTES bin lib native-jni-lib webapps work root@3fba46045c12:/usr/local/tomcat# cd webapps root@3fba46045c12:/usr/local/tomcat/webapps# #问题 linux命令少了,webapps是空的,为什么? 应为阿里云的镜像是最小的,把不必要的都剔除掉了,保证最小的运行 #webapps.dist 我们之前webapps的东西都在这个dist里面,只需要复制内容到webapps中就可以完成访问了
思考:每次开一个tomcat的容器,就得去复制一次dist文件,要是我部署了项目岂不是每次都会消失,没有持久化,那还得了。这个还只是tomcat。要是mysql容器删除了,那岂不是直接数据全部丢失。
可视化
- portainer(先使用这个)
docker run -d -p 8088:9000\ --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer
- Rancher(CI/CD再用)
什么是portainer
docker run -d -p 8088:9000\ --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer
之后就可以通过它访问了
http://120.79.14.203:8088/#/init/admin
进入之后会要先注册一个账号
之后选择本地的
之后就可以看到docker的内容了
比如有多少镜像阿,多少容器阿,可以点进去操作命令
Docker 快速入门(二)https://developer.aliyun.com/article/1469456