- Linux CentOS7
- XShell
#系统内核是 3.10以上的 [root@localhost ~]# uname -r 3.10.0-693.el7.x86_64
#系统版本 [root@localhost ~]# 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"安装
打开官网
https://www.docker.com/get-started
帮助文档查看,安装步骤
-
安装环境
-
To install Docker Engine, you need a maintained version of CentOS 7 or 8. Archived versions aren’t supported or tested.
-
-
卸载旧版本
-
sudo yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine
-
-
需要的安装包
-
sudo yum install -y yum-utils
-
-
设置镜像仓库
-
#默认是国外的 sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo #阿里云(推荐使用) yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
-
-
更新yum软件包索引
-
[root@localhost ~]# yum makecache fast 已加载插件:fastestmirror, langpacks base | 3.6 kB 00:00:00 extras | 2.9 kB 00:00:00 updates | 2.9 kB 00:00:00 Loading mirror speeds from cached hostfile * base: mirrors.aliyun.com * extras: mirrors.163.com * updates: mirrors.aliyun.com
-
-
安装docker相关的内容
-
#docker-ce社区版 docker-ee 企业版 sudo yum install docker-ce docker-ce-cli containerd.io
-
- 启动docker
-
sudo systemctl start docker
-
-
检查是否安装成功
-
docker version
-
[root@localhost ~]# docker versionClient: Docker Engine - Community Version: 20.10.8 API version: 1.41 Go version: go1.16.6 Git commit: 3967b7d Built: Fri Jul 30 19:55:49 2021 OS/Arch: linux/amd64 Context: default Experimental: trueServer: Docker Engine - Community Engine: Version: 20.10.8 API version: 1.41 (minimum version 1.12) Go version: go1.16.6 Git commit: 75249d8 Built: Fri Jul 30 19:54:13 2021 OS/Arch: linux/amd64 Experimental: false containerd: Version: 1.4.9 GitCommit: e25210fe30a0a703442421b0f60afac609f950a3 runc: Version: 1.0.1 GitCommit: v1.0.1-0-g4144b63 docker-init: Version: 0.19.0 GitCommit: de40ad0
-
-
测试helloworld
-
sudo docker run hello-world
-
[root@localhost ~]# docker run hello-worldUnable to find image 'hello-world:latest' locallylatest: Pulling from library/hello-worldb8dfde127a29: Pull complete Digest: sha256:7d91b69e04a9029b99f3585aaaccae2baa80bcf318f4a5d2165a9898cd2dc0a1Status: Downloaded newer image for hello-world:latestHello from Docker!This message shows that your installation appears to be working correctly.To generate this message, Docker took the following steps: 1. The Docker client contacted the Docker daemon. 2. The Docker daemon pulled the "hello-world" image from the Docker Hub. (amd64) 3. The Docker daemon created a new container from that image which runs the executable that produces the output you are currently reading. 4. The Docker daemon streamed that output to the Docker client, which sent it to your terminal.To try something more ambitious, you can run an Ubuntu container with: $ docker run -it ubuntu bashShare images, automate workflows, and more with a free Docker ID: https://hub.docker.com/For more examples and ideas, visit: https://docs.docker.com/get-started/
-
-
查看下载的这个hello-world镜像
-
[root@localhost ~]# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEhello-world latest d1165f221234 5 months ago 13.3kB
-
-
了解:卸载docker
-
#1.Uninstall the Docker Engine, CLI, and Containerd packages:sudo yum remove docker-ce docker-ce-cli containerd.io#2.Images, containers, volumes, or customized configuration files on your host are not automatically removed. To delete all images, containers, and volumes:sudo rm -rf /var/lib/dockersudo rm -rf /var/lib/containerd
-
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EBxCxWGx-1633510608757)(F:Java學習笔记note_imagedocker阿里云镜像服务.png)]
- 登录阿里云,找到容器镜像服务
- 找到镜像加速地址
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eOhlGDUs-1633510608759)(F:Java學習笔记note_imagedocker阿里云镜像加速地址.png)]
-
配置使用
-
#第一步sudo mkdir -p /etc/docker#第二步sudo tee /etc/docker/daemon.json <<-'EOF'{ "registry-mirrors": ["https://t4c3om50.mirror.aliyuncs.com"]}EOF#第三步sudo systemctl daemon-reload#第四步sudo systemctl restart docker
-
- run运行流程分析图
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mniEB2oA-1633510608760)(F:Java學習笔记note_imagedockerDocker中HelloWorld镜像运行流程.png)]
底层原理 Docker是如何工作的?-
Docker是一个Client-Server结构的系统,Docker的守护进程运行在主机上,通过Socket从客户端访问
-
DockerServer接受到Docker-Client的指令,就会执行这个命令
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UaIrl33s-1633510608762)(F:Java學習笔记note_imagedockerdocker底层实现原理.png)]
Docker为什么比VM快?- Docker有比VM更少的抽象层
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Mt5Ndfsv-1633510608762)(F:Java學習笔记note_imagedockerdocker对比VM结构.png)]
- docker利用的是宿主机的内核,vm需要是Guest OS
- 所以说,新建一个容器的时候,docker不需要虚拟机一样重新加载一个操作系统内核,避免引导。虚拟机是加载Guest OS,是分钟级别的。而docker是利用宿主机的操作系统,省略了这个复杂的过程,是秒级别的。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fLHGllB1-1633510608763)(F:Java學習笔记note_imagedockerdocker对比VM性能.png)]
Docker的常用命令 帮助命令docker version # 显示docker的版本信息docker info # 显示docker的系统信息,包括镜像和容器的数量docker 命令 --help #万能命令
帮助文档的地址:https://docs.docker.com/engine/reference/
官网 --> doc --> reference
镜像命令 images 查看本机上的所有本地镜像-
docker images 查看本机上的所有本地镜像
-
[root@localhost ~]# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEhello-world latest d1165f221234 5 months ago 13.3kB
-
REPOSITORY:镜像的仓库源
-
TAG:镜像的标签
-
IMAGE ID:镜像的ID
-
CREATED:创建时间
-
SIZE:镜像的大小
-
[root@localhost ~]# docker images --helpUsage: docker images [OPTIONS] [REPOSITORY[:TAG]]List imagesOptions: -a, --all Show all images (default hides intermediate images) -q, --quiet only show image IDs
-
-a:显示所有镜像
-
-q:显示镜像ID
-
[root@localhost ~]# docker search mysqlNAME DEscriptION STARS OFFICIAL AUTOMATEDmysql MySQL is a widely used, open-source relation… 11325 [OK] mariadb MariaDB Server is a high performing open sou… 4303 [OK] #可选项:通过搜索来过滤--filter=STARS=3000 #搜索出来的镜像STARS大于3000[root@localhost ~]# docker search mysql --filter=STARS=3000NAME DEscriptION STARS OFFICIAL AUTOMATEDmysql MySQL is a widely used, open-source relation… 11325 [OK] mariadb MariaDB Server is a high performing open sou… 4303 [OK]docker pull 下载镜像
# 下载镜像docker pull 镜像名[:tag][root@localhost ~]# docker pull mysqlUsing default tag: latest # 如果不写tag,默认就是lastestlatest: Pulling from library/mysqle1acddbe380c: Pull complete # 分层下载,docker image的核心 联合文件系统bed879327370: Pull complete 03285f80bafd: Pull complete ccc17412a00a: Pull complete 1f556ecc09d1: Pull complete adc5528e468d: Pull complete 1afc286d5d53: Pull complete 6c724a59adff: Pull complete 0f2345f8b0a3: Pull complete c8461a25b23b: Pull complete 3adb49279bed: Pull complete 77f22cd6c363: Pull complete Digest: sha256:d45561a65aba6edac77be36e0a53f0c1fba67b951cb728348522b671ad63f926Status: Downloaded newer image for mysql:latestdocker.io/library/mysql:latest #真实地址#等价于它[root@localhost ~]# docker pull mysql[root@localhost ~]# docker pull docker.io/mysql:lastest# 指定版本下载[root@localhost ~]# docker pull mysql:5.75.7: Pulling from library/mysqle1acddbe380c: Already exists bed879327370: Already exists 03285f80bafd: Already exists ccc17412a00a: Already exists 1f556ecc09d1: Already exists adc5528e468d: Already exists 1afc286d5d53: Already exists 4d2d9261e3ad: Pull complete ac609d7b31f8: Pull complete 53ee1339bc3a: Pull complete b0c0a831a707: Pull complete Digest: sha256:7cf2e7d7ff876f93c8601406a5aa17484e6623875e64e7acc71432ad8e0a3d7eStatus: Downloaded newer image for mysql:5.7docker.io/library/mysql:5.7
镜像查看
[root@localhost ~]# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEmysql 5.7 6c20ffa54f86 9 days ago 448MBmysql latest 5a4e492065c7 9 days ago 514MBhello-world latest d1165f221234 5 months ago 13.3kBdocker rmi 删除镜像
[root@localhost ~]# docker rmi -f 6c20ffa54f86 #通过ID删除指定镜像[root@localhost ~]# docker rmi -f 6c20ffa54f86 5a4e492065c7 #删除多个镜像[root@localhost ~]# docker rmi -f ${docker images -aq} #删除所有镜像
容器命令
说明:有了镜像才可以创建容器
- 下载一个centos镜像来测试
[root@localhost ~]# docker pull centosUsing default tag: latestlatest: Pulling from library/centos7a0437f04f83: Pull complete Digest: sha256:5528e8b1b1719d34604c87e11dcd1c0a20bedf46e83b5632cdeac91b8c04efc1Status: Downloaded newer image for centos:latestdocker.io/library/centos:latest新建容器并启动
docker run[可选参数] image#参数说明--name="Name" 容器名字,用于区分容器-d 后台方式运行-it 使用交互方式运行,进入容器查看难爱用-p 指定容器的端口 -p 8080:8080 -p ip:主机端口:容器端口 -p 主机端口:容器端口 (常用) -p 容器端口-P 随机指定端口 # 测试,启动并进入容器[root@localhost ~]# docker run -it centos /bin/bash[root@a4664e605673 /]# ls #查看容器内的centos,基础版本,很多命令都是不完善的bin etc lib lost+found mnt proc run srv tmp vardev home lib64 media opt root sbin sys usr#从容器退出主机[root@a4664e605673 /]# exitexit[root@localhost ~]# lsaaa animal extra_timi.dic initial-setup-ks.cfg 模板 图片 下载 桌面anaconda-ks.cfg apache-tomcat-7.0.75 fruit 公共 视频 文档 音乐列取所有的运行的容器
#docker ps命令 # 列出当前正在运行的容器-a # 列出当前正在运行的容器+历史运行过的容器-n=? # 显示最近创建的容器-q # 只显示容器的编号[root@localhost ~]# docker psConTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES[root@localhost ~]# [root@localhost ~]# docker ps -aConTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESa4664e605673 centos "/bin/bash" 4 minutes ago Exited (0) about a minute ago pedantic_wiles66e273e6db29 hello-world "/hello" 14 hours ago Exited (0) 14 hours ago wizardly_rubin[root@localhost ~]# docker ps -n=2ConTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESa4664e605673 centos "/bin/bash" 7 minutes ago Exited (0) 5 minutes ago pedantic_wiles66e273e6db29 hello-world "/hello" 14 hours ago Exited (0) 14 hours ago wizardly_rubin[root@localhost ~]# docker ps -aqa4664e60567366e273e6db29退出容器
exit # 直接容器停止并退出Ctrl + P + Q # 容器不停止退出#容器不停止退出[root@localhost ~]# docker psConTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES[root@localhost ~]# docker run -it centos /bin/bash[root@2e8d67507fcf /]# [root@localhost ~]# docker psConTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES2e8d67507fcf centos "/bin/bash" 18 seconds ago Up 17 seconds zealous_wu删除容器
docker rm 容器ID #删除指定容器,不能删除正在运行的容器docker rm -f $(docker ps -aq) #删除所有的容器docker ps -a -q|xargs docker rm -f #删除所有的容器启动和停止容器的操作
docker start 容器ID #启动容器docker restart 容器ID #重启容器docker stop 容器ID #停止当前正在运行的容器docker kill 容器ID #强制停止当前容器常用的其他命令 后台启动容器
[root@localhost ~]# docker run -d centos18c2ea0959a1c49e45119995678e2850f6fa2e32f3b93583c5acc09d92bcce15[root@localhost ~]# docker psConTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES# 问题用docker ps命令发现centos停止了# 常见的坑,docker容器使用后台运行,就必须要有一个前台进程,docker发现没有应用,就会自动停止# nginx,容器启动后,发现自己没有提供服务就会立刻停止,就没有程序了查看日志
docker logs -f -t --tail 容器ID[root@localhost ~]# docker run -d centos /bin/sh -c "while true;do echo gavinjoeng;sleep 1;done"3fa5ddb72ebcee3065c0c7383e9d33aaf4b89f805326818ee4f04f3361afaf4c[root@localhost ~]# docker psConTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES3fa5ddb72ebc centos "/bin/sh -c 'while t…" 3 seconds ago Up 2 seconds naughty_leavitt#显示日志[root@localhost ~]# docker logs -tf --tail 10 3fa5ddb72ebc2021-08-27T15:28:15.411823465Z gavinjoeng2021-08-27T15:28:16.413672805Z gavinjoeng2021-08-27T15:28:17.416079677Z gavinjoeng2021-08-27T15:28:18.420492674Z gavinjoeng2021-08-27T15:28:19.424540768Z gavinjoeng2021-08-27T15:28:20.426611589Z gavinjoeng2021-08-27T15:28:21.430560124Z gavinjoeng2021-08-27T15:28:22.434961818Z gavinjoeng2021-08-27T15:28:23.439664019Z gavinjoeng2021-08-27T15:28:24.443796818Z gavinjoeng2021-08-27T15:28:25.446166648Z gavinjoeng2021-08-27T15:28:26.448911908Z gavinjoeng2021-08-27T15:28:27.451890978Z gavinjoeng[root@localhost ~]# docker logs --help-tf #显示日志--tail number #要显示日志条数# 参数说明 --details Show extra details provided to logs -f, --follow Follow log output --since string Show logs since timestamp (e.g. 2013-01-02T13:23:37Z) or relative (e.g. 42m for 42 minutes) -n, --tail string Number of lines to show from the end of the logs (default "all") -t, --timestamps Show timestamps --until string Show logs before a timestamp (e.g. 2013-01-02T13:23:37Z) or relative (e.g. 42m for 42 minutes)查看容器中进程信息 ps
# 命令docker top容器id[root@localhost ~]# docker top 3fa5ddb72ebcUID PID PPID C STIME TTY TIME CMDroot 3785 3764 0 23:27 ? 00:00:00 /bin/sh -c while true;do echo gavinjoeng;sleep 1;doneroot 4305 3785 0 23:33 ? 00:00:00 /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep 1查看镜像的元数据
[root@localhost ~]# docker inspect 3fa5ddb72ebc# 查看镜像的元数据[ { "Id": "3fa5ddb72ebcee3065c0c7383e9d33aaf4b89f805326818ee4f04f3361afaf4c", "Created": "2021-08-27T15:27:06.49589249Z", "Path": "/bin/sh", "Args": [ "-c", "while true;do echo gavinjoeng;sleep 1;done" ], "State": { "Status": "running", "Running": true, "Paused": false, "Restarting": false, "OOMKilled": false, "Dead": false, "Pid": 3785, "ExitCode": 0, "Error": "", "StartedAt": "2021-08-27T15:27:06.950495944Z", "FinishedAt": "0001-01-01T00:00:00Z" }, "Image": "sha256:300e315adb2f96afe5f0b2780b87f28ae95231fe3bdd1e16b9ba606307728f55", "ResolvConfPath": "/var/lib/docker/containers/3fa5ddb72ebcee3065c0c7383e9d33aaf4b89f805326818ee4f04f3361afaf4c/resolv.conf", "HostnamePath": "/var/lib/docker/containers/3fa5ddb72ebcee3065c0c7383e9d33aaf4b89f805326818ee4f04f3361afaf4c/hostname", "HostsPath": "/var/lib/docker/containers/3fa5ddb72ebcee3065c0c7383e9d33aaf4b89f805326818ee4f04f3361afaf4c/hosts", "LogPath": "/var/lib/docker/containers/3fa5ddb72ebcee3065c0c7383e9d33aaf4b89f805326818ee4f04f3361afaf4c/3fa5ddb72ebcee3065c0c7383e9d33aaf4b89f805326818ee4f04f3361afaf4c-json.log", "Name": "/naughty_leavitt", "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/86543b769cabebb54b3a9b6500f311a183a79ea98dc967e432ba4bea646f5419-init/diff:/var/lib/docker/overlay2/808c328f1ed4dd18a455a956c4bc9fac7036ff068d96f41200c953c0371f2700/diff", "MergedDir": "/var/lib/docker/overlay2/86543b769cabebb54b3a9b6500f311a183a79ea98dc967e432ba4bea646f5419/merged", "UpperDir": "/var/lib/docker/overlay2/86543b769cabebb54b3a9b6500f311a183a79ea98dc967e432ba4bea646f5419/diff", "WorkDir": "/var/lib/docker/overlay2/86543b769cabebb54b3a9b6500f311a183a79ea98dc967e432ba4bea646f5419/work" }, "Name": "overlay2" }, "Mounts": [], "Config": { "Hostname": "3fa5ddb72ebc", "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 gavinjoeng;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": "eabaaa7b520e7436863111eb41d2f1218d12c75dcea461713c44d078f8e9b2b2", "HairpinMode": false, "linkLocalIPv6Address": "", "linkLocalIPv6PrefixLen": 0, "Ports": {}, "SandboxKey": "/var/run/docker/netns/eabaaa7b520e", "SecondaryIPAddresses": null, "SecondaryIPv6Addresses": null, "EndpointID": "f22eec6e40da41e3a202c282c89f3d5cae600714aef6397b210da6b5dee386c7", "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": "dd8a2dfb2294325f7aae3845b6926f078395438b00762592f1d0affb75004343", "EndpointID": "f22eec6e40da41e3a202c282c89f3d5cae600714aef6397b210da6b5dee386c7", "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 /bin/bash[root@localhost ~]# docker psConTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES4cfbffdf6ff0 centos "/bin/bash" 2 minutes ago Up 2 minutes peaceful_rosalind[root@localhost ~]# docker exec -it 4cfbffdf6ff0 /bin/bash[root@4cfbffdf6ff0 /]# lsbin etc lib lost+found mnt proc run srv tmp vardev home lib64 media opt root sbin sys usr[root@4cfbffdf6ff0 /]# ps -efUID PID PPID C STIME TTY TIME CMDroot 1 0 0 00:42 pts/0 00:00:00 /bin/bashroot 16 0 0 00:43 pts/1 00:00:00 /bin/bashroot 33 0 0 00:45 pts/2 00:00:00 /bin/bashroot 49 33 1 00:46 pts/2 00:00:00 ps -ef#方式二#命令docker attach 容器id[root@localhost ~]# docker psConTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES4cfbffdf6ff0 centos "/bin/bash" 10 minutes ago Up 10 minutes peaceful_rosalind[root@localhost ~]# docker attach 4cfbffdf6ff0 [root@4cfbffdf6ff0 /]#
- 两者区别
- docker exec -it 容器id /bin/bash:进入容器后开启一个新的终端,可以在里面操作(常用)
- docker attach 容器id:进入容器正在执行的终端,不会启动新的进程
docker cp 容器id:容器内路径 目的主机路径# 运行一个容器[root@localhost ~]# docker run -it centos /bin/bash# 进入容器[root@localhost home]# docker attach 397c3156371a [root@397c3156371a /]# cd /home# 查看容器目录[root@397c3156371a home]# ls#创建文件[root@397c3156371a home]# touch forCopyTest.java# 退出容器[root@397c3156371a home]# exitexit[root@localhost home]# docker psConTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES# 容器文件复制到主机[root@localhost home]# docker cp 397c3156371a:/home/forCopyTest.java /home# 查看主机文件[root@localhost home]# lsforCopyTest.java gavinjoeng.java jeonggwongjyu总结
- Docker Commands Diagram
- 启动docker
sudo systemctl start docker
- docker search 搜索镜像
[root@localhost ~]# docker search mysql容器生命周期管理
- run
- start/stop/restart
- kill
- rm
- pause/unpause
- create
- exec
- ps
- inspect
- top
- attach
- events
- logs
- wait
- export
- port
- commit
- cp
- diff
- login
- pull
- push
- search
- images
- rmi
- tag
- build
- history
- save
- load
- import
- info|version
- info
- version
# 启动nginxsystemctl start docker# 搜索镜像docker search nginx# 下载镜像docker pull nginx# 后台启动并且以名字为nginx01、端口号为3344启动nginxdocker run -d --name nginx01 -p 3344:80 nginx#参数: -d 后台运行 --name 起名 -p 端口# 运行测试docker pscurl localhost:3344端口暴露
- 思考问题:我们每次改动nginx配置文件,都需要进入容器内部,十分麻烦,我要可以在容器外部提供一个映射路径,达到在容器修改文件名,容器内部就可以自动修改?
- -v 数据卷
# 知识点补充:官方使用docker run -it --rm tomcat:9.0我们之前的启动都是后台,停止容器之后,容器还是可以查到,docker run -it --rm,一般用来测试,用完就删除# 下载再启动Tomcatdocker pull tomcat# 启动运行docker run -d -p 3355:8080 --name tomcat01 tomcat# 浏览器访问192.168.180.96:3355# 进入容器docker exec -it tomcat01 /bin/bash# 发现问题:# 1. linux命令少了# 2. 没有webapps# 原因: 默认为最少镜像,阉割版本,发现文件在webapps.dist目录下# 把webapps.dist的文件复制到webapps目录下cp -r webapps.dist/* webapps# 页面可以正常显示啦~
- 思考问题:我们以后要部署项目,如果每次都要进入容器都需要进入容器内部,十分麻烦,我要可以在容器外部提供一个映射路径webapps,我们在外部放置项目就自动同步到内部就好啦~
- es 暴露的端口很多、十分消耗内存,es的数据一般需要放置到安全目录,挂载!
# --net somenetwork 网络配置,暂时去掉#$ docker run -d --name elasticsearch --net somenetwork -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:tag# 启动elasticsearchdocker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.6.2# 查看cpu状态docker stats # 测试es否成功了curl localhost:9200
- docker所占内存
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SzDz2zLY-1633510608767)(F:Java學習笔记note_imagedockerdocker中es所占用内存.png)]
- 如何限制内存限制
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
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SxabHYNc-1633510608767)(F:Java學習笔记note_imagedockerdocker对es限制内存后.png)]
- 思考的问题:使用Kibana连接ES,思考网络如何才能连接过去
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ggrjv09G-1633510608769)(F:Java學習笔记note_imagedocker使用Kibana连接ES.png)]
端口号占用问题 解决 Error starting userland proxy: listen tcp 0.0.0.0:6379: bind: address already in use今天启动redis突然出现连接端口有问题,错误如下:
truedei@truedei:~$ truedei@truedei:~$ sudo docker start redisError response from daemon: driver failed programming external connectivity on endpoint redis (87977922525bd67cb6e39c26b2f0229081ff428693991d923c595752a733d41b): Error starting userland proxy: listen tcp 0.0.0.0:6379: bind: address already in useError: failed to start containers: redistruedei@truedei:~$
就查了下端口,果然有在使用的:
truedei@truedei:~$ netstat -ntpl |grep 6379(Not all processes could be identified, non-owned process info will not be shown, you would have to be root to see it all.)tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN - truedei@truedei:~$
查一下是谁在占用,让我很是惊讶,居然是他自己,端口被占用了,而且还没启动
truedei@truedei:~$ ps -aux |grep 6379redis 1397 0.0 0.0 42608 2292 ? Ssl 07:30 0:00 /usr/bin/redis-server 127.0.0.1:6379truedei 5096 0.0 0.0 14536 976 pts/4 S+ 07:33 0:00 grep 6379truedei@truedei:~$ truedei@truedei:~$ sudo docker psConTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMEStruedei@truedei:~$ truedei@truedei:~$
先结束掉在说,奇怪的是,杀都杀不掉
truedei@truedei:~$ sudo kill -9 1397truedei@truedei:~$ ps -aux |grep 6379redis 8263 0.0 0.0 42608 2164 ? Ssl 07:35 0:00 /usr/bin/redis-server 127.0.0.1:6379truedei 8291 0.0 0.0 14536 984 pts/4 S+ 07:35 0:00 grep 6379truedei@truedei:~$
仔细看了一下这个redis并不是docker中安装的redis,而是在本机的:
/usr/bin/redis-server
那就停止掉本机的,果然可以了:
truedei@truedei:~$ /etc/init.d/redis-server stop[ ok ] Stopping redis-server (via systemctl): redis-server.service.truedei@truedei:~$ truedei@truedei:~$ ps -aux |grep 6379truedei 10583 0.0 0.0 14536 948 pts/4 S+ 07:37 0:00 grep 6379truedei@truedei:~$ truedei@truedei:~$
然后再启动:
truedei@truedei:~$ truedei@truedei:~$ sudo docker start redisredistruedei@truedei:~$ truedei@truedei:~$ sudo docker psConTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES85cb7d83a2ff redis "docker-entrypoint.s…" 22 hours ago Up 5 seconds 0.0.0.0:6379->6379/tcp redistruedei@truedei:~$ truedei@truedei:~$
总结:
可视化出现这种情况的大多数原因都是自己的本机安装了redis,而docker中安装的redis与物理机绑定的端口号是相同的,所以就造成了这个原因。 解决方案有很多种: 1、直接卸载物理机的redis 2、不让开机启动 3、修改docker映射的端口号 4、…等
-
portainer
-
Rancher(CI/CD再用)
// 建议不要使用9000端口直接映射docker run -d -p 8088:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer
访问:http://192.168.180.96:8088/
Docker镜像讲解 镜像是什么镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于环境开发的软件,它包含运行某个软件所需的所有内容,包括代码、运行时、库、环境变量和配置文件
所有的应用,直接打包docker镜像,就可以直接跑起来
如何得到镜像:
- 远程仓库下载
- 自己制作一个镜像DockerFile
UnionFS(联合文件系统)
UnionFS (联合文件系统) : Union文件系统( UnionFS)是一种分层、 轻量级并且高性能的文件系统,它支持对文件系统的修改
作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual
filesystem)。Union 文件系统是Docker镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像) ,可以制作各
种具体的应用镜像。
特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的
文件系统会包含所有底层的文件和目录
Docker 镜像加载原理
docker的镜像实际上由一层一层的文件 系统组成,这种层级的文件系统UnionFS.
bootfs(boot file system)主要包含bootloader和kernel, bootloader主要是引导加载kernel, Linux刚启动时会加载bootfs文件系统,在Docker镜像的最底层是bootfs。这-层与我们典型的Linux/Unix系统是一样的 ,包含boo加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs.
rootfs (root file system) , 在bootfs之上。包含的就是典型Linux系统中的/dev, /proc, /bin, /etc等标准目录和文件。rootfs就是各种不同的操作系统发行版,比如Ubuntu , Centos等等。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NMnU1tiL-1633510608769)(F:Java學習笔记note_imagedockerDocker 镜像加载的原理.png)]
平时我们安装进虚拟机的 Centos 都是好几个 G,为什么 docker 才 200MB
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZQ2riYac-1633510608771)(F:Java學習笔记note_imagedockerdocker镜像为什么这么小.png)]
对于一个精简的 OS,rootfs 可以是很小,只需要包含最基本的命令,工具和程序库就可以了,因为底层直接用 Host 的 kernel,自己只需要提供 rootfs 就可以了,由此可见对于不同的 linux 发行版,bootfs 基本是一致的,rootfs 会有差别,因此不同的发行版可以公用 bootfs。
分层理解分层的镜像
我们可以去下载一个镜像,注意观察下载的日志输出,可以看到是一层一层的在下载。
为什么 Docker 镜像要采用这种分层的结构呢
最大的好处就是资源共享,比如多个镜像都从相同的 base 镜像构建而来的,那么宿主机只需要在磁盘上保留一份 base 镜像,同时内存中也只需要加载一份 base 镜像,这样就可以为所有的容器服务了,而且镜像的每一层都可以被共享。
查看镜像的分层的方式可以通过 docker image inspect 命令。
docker image inspect redis:latest[ //... "RootFS": { "Type": "layers", "Layers": [ "sha256:95ef25a3204339de1edf47feaa00f60b5ac157a498964790c58c921494ce7ffd", "sha256:ad9080bec957893dd0e5d146ec4fed09232e4d2c40d6975bfb1d31ad7eeba6ae", "sha256:03f8dae99b4d972acfb5afb240d170f71420aed3960b1b9e502c718938fc41a5", "sha256:ce89ae6e6358780e4f0ac30e78edb8a867c577765ab2daa7eaac447701228863", "sha256:e7b10f84d45b2e8277e0d2b49db8137aa2c5a01f90c8e951477425a1521f1bc2", "sha256:ed8f8f354de8b585acea9d30ce39cfea0b2f74d1572b3ba045cdbd5441e8f918" ] }, "metadata": { "LastTagTime": "0001-01-01T00:00:00Z" } }]
- 理解
所有的Docker 镜像都起始于一个基础镜像层,当进行修改或者增加新的内容时,就会在当前镜像层之上,创建新的镜像层。
举一个简单的例子,假如基于Ubuntu Linux 16.04 创建一个新的镜像,这就是镜像的第一层;如果在该镜像中添加Python包,就会在基础镜像层之上创建第二个镜像层;如果继续添加一个安全补丁,就会创建第三个镜像层。
该镜像当前已经包含三个镜像层,如下图所示(这只是一个用于演示的简单的例子)
在添加额外的镜像层的同时,镜像始终保持当前所有镜像的组合,理解这一点非常重要,下图中举了一个简单的例子,每个镜像层包含3个文件,而镜像包含了来自两个镜像层的6个文件。
上图中的镜像层跟之前图中的略有所区别,主要是便于展示文件。
下图中展示了一个稍微复杂的三层镜像,在外部看来整个镜像文件只有6个,这是因为最上层的文件7是文件5的一个更新版本。
这种情况下,上层镜像层中的文件覆盖了底层镜像层中的文件。这样就使得文件的更新版本作为一个新镜像层添加到镜像当中。
Docker通过存储引擎(新版本采用快照机制)的方式来实现镜像层堆栈,并保证多镜像层对外展示为统一的文件 系统。
Linux上可用的存储引擎有AUFS、Overlay2、 Device Mapper、Btrfs 以及ZFS.顾名思义,每种存储引擎都基于Linux 中对应的
文件系统或者块设备技术,并且每种存储引擎都有其独有的性能特点。
Docker在Windows上仅支持windowsfilter 一种存储引擎,该引擎基于NTFS文件系统之上实现了分层和CoW[1]。
下图展示了与系统显示相同的三层镜像。所有镜像层堆叠并合并,对外提供统一的视图。
特点
Docker镜像都是只读的,当容器启动后,一个新的可写层被加载到镜像的顶部!
这一层就是我们通常说的容器层,容器层之下的都交镜像层。
我们所有的操作都是基于容器操作的。
- 在这幅图中,我们可以看到,Docker 容器的生命周期里分为五种状态,其分别代表着:
- Created:容器已经被创建,容器所需的相关资源已经准备就绪,但容器中的程序还未处于运行状态。
- Running:容器正在运行,也就是容器中的应用正在运行。
- Paused:容器已暂停,表示容器中的所有程序都处于暂停 ( 不是停止 ) 状态。
- Stopped:容器处于停止状态,占用的资源和沙盒环境都依然存在,只是容器中的应用程序均已停止。
- Deleted:容器已删除,相关占用的资源及存储在 Docker 中的管理信息也都已释放和移除。
docker commit 提交容器成为一个新的副本# 命令和git原理类似$ docker commit -m="提交的描述信息" -a="作者" 容器id 目标镜像名:[TAG]
实战测试
- 启动tomcat
docker run -it --name tomcat-gavinjoeng -p 8080:8080 tomcat
- 进入tomcat容器
docker exec -it tomcat-gavinjoeng /bin/bash
- 把webapps.dist的文件复制到webapps目录下
cp -r webapps.dist/* webapps
- 将操作过的容器通过commit提交为一个镜像
docker commit -a="gavinjoeng" -m="add index to webapps" a44a58b7174b tomcat-gavinjoeng
如果想要保存当前容器的状态,可以通过 commit 来提交,获得一个镜像,就好比之前 vm 虚拟机的快照
容器数据卷 什么是容器数据卷docker的理念回顾
将应用和环境打包成一个镜像
如果数据都在容器中,那么我们容器删除,数据就会丢失!需求:数据可以持久化
需求:MySQL数据可以存储在本地!容器之间可以有一个数据共享的技术!Docker容器中产生的数据,同步到本地!这就是卷技术,目录的挂载,将我们容器内的目录,挂载到Linux上面
总结:容器的持久化和同步操作,容器间也是可以数据共享的!
使用数据卷方式一:直接使用命令来挂载 -v
docker run -it -v #主机目录,容器内目录,互为映射# 测试docker run -it -v /home/test:/home centos /bin/bash



