Docker
概述
官网:https://docs.docker.com/
容器就是将软件打包成标准化单元,以用于开发、交付和部署。
- 容器镜像是轻量的、可执行的独立软件包 ,包含软件运行所需的所有内容:代码、运行时环境、系统工具、系统库和设置。
- 容器化软件适用于基于 Linux 和 Windows 的应用,在任何环境中都能够始终如一地运行。
- 容器赋予了软件独立性,使其免受外在环境差异(例如,开发和预演环境的差异)的影响,从而有助于减少团队间在相同基础设施上运行不同软件时的冲突。
组成
Docker 中有非常重要的三个基本概念,理解了这三个概念,就理解了 Docker 的整个生命周期。

- Image(镜像)
Docker 镜像(Image)就是一个只读的模板。镜像可以用来创建 Docker 容器,一个镜像可以创建很多容器。
- Container(容器)
Docker 利用容器(Container)独立运行一个或一组应用。容器是使用镜像创建的运行实例。
它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。
- Repository(仓库)
仓库(Repository)是集中存放镜像文件的场所。
安装&卸载
安装
# 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 \
https://download.docker.com/linux/centos/docker-ce.repo
# 更新 yum 软件包索引
sudo yum makecache fast
# 4.安装 docker (ce:社区版,ee:企业版)
sudo yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin
# 5.启动 docker
sudo systemctl start docker
# 6.判断是否安装成功
docker version
# 7.hello-world
sudo docker run hello-world
# 8.查看 docker 镜像
sudo docker images
卸载
# 1.卸载依赖
sudo yum remove docker-ce docker-ce-cli containerd.io docker-compose-plugin
# 2.删除资源
sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd
# /var/lib/docker docker 默认工作目录
常用命令
帮助文档: https://docs.docker.com/engine/reference/commandline/docker/
帮助命令
docker version # 显示 docker 版本信息
docker info # 显示 docker 系统信息,包括镜像和容器的数量
docker [command] --help # 帮指命令
镜像命令
docker images: 查看所有本地主机上的镜像
# Usage: docker images [OPTIONS] [REPOSITORY[:TAG]]
# List images
# Options:
# -a, --all Show all images (default hides intermediate images)
# -q, --quiet Only show image IDs
# [lixun@aliecs ~]$ docker images
# (仓库源) (标签) (ID) (创建时间) (大小)
# REPOSITORY TAG IMAGE ID CREATED SIZE
# hello-world latest feb5d9fea6a5 9 months ago 13.3kB
docker search: 搜索镜像
docker search ${imageName} [-f(k=v)]
# Usage: docker search [OPTIONS] TERM
# Search the Docker Hub for images
# Options:
# -f, --filter filter Filter output based on conditions provided
# [lixun@aliecs ~]$ docker search mysql -f stars=3000
# NAME DESCRIPTION STARS OFFICIAL AUTOMATED
# mysql MySQL is a widely used, open-source relation… 12782 [OK]
# mariadb MariaDB Server is a high performing open sou… 4909 [OK]
docker pull: 下载镜像
# Usage: docker pull [OPTIONS] NAME[:TAG|@DIGEST]
# Pull an image or a repository from a registry
# docker pull hello-world => docker pull docker.io/library/hello-world:latest
# [lixun@aliecs ~]$ docker pull hello-world
# Using default tag: latest
# latest: Pulling from library/hello-world
# 2db29710123e: Pull complete
# Digest: sha256:2498fce14358aa50ead0cc6c19990fc6ff866ce72aeb5546e1d59caac3d0d60f
# Status: Downloaded newer image for hello-world:latest
# docker.io/library/hello-world:latest
docker rmi: 删除镜像
# Usage: docker rmi [OPTIONS] IMAGE [IMAGE...]
# Remove one or more images
# Options:
# -f, --force Force removal of the image
# --no-prune Do not delete untagged parents
# 可以通过 REPOSITORY | ID | $()
# [lixun@aliecs ~]$ docker rmi hello-world:latest
# Untagged: hello-world:latest
# Untagged: hello-world@sha256:2498fce14358aa50ead0cc6c19990fc6ff866ce72aeb5546e1d59caac3d0d60f
# Deleted: sha256:feb5d9fea6a5e9606aa995e879d862b825965ba48de054caab5ef356dc6b3412
# Deleted: sha256:e07ee1baac5fae6a26f30cabfe54a36d3402f96afda318fe0a96cec4ca393359
# 1.查询所有ID: docker images -q
# 2.将IDs传给 rmi: docker rmi $(docker images -q)
容器命令
docker run: 新建容器并运行镜像
# Usage: docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
# Run a command in a new container
# Options:
# --name string Assign a name to the container
# -d, --detach Run container in background and print container ID
# -i, --interactive Keep STDIN open even if not attached
# -t, --tty Allocate a pseudo-TTY
# -p, --publish list Publish a container's port(s) to the host
# -p ip:主机端口:容器端口
# -p 主机端口:容器端口
# -p 容器端口
# 容器端口
# -P, --publish-all Publish all exposed ports to random ports
进入容器
[lixun@aliecs /]$ docker run -it --name docker_centos centos /bin/bash
[root@e7e8837a0363 /]# ls
# bin etc lib lost+found mnt proc run srv tmp var
# dev home lib64 media opt root sbin sys usr
exit: 从容器中退出,并关闭容器
[root@e7e8837a0363 /]# exit
# exit
Ctrl+P+Q: 退出容器,但不关闭容器
[root@e7e8837a0363 /]# 按 Ctrl+P+Q
docker exec & docker attach: 进入运行中的容器
# exec 开启一个新的终端
# Usage: docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
# Run a command in a running container
[lixun@aliecs /]$ docker exec -it e7e8 /bin/bash
[root@e7e8837a0363 /]# =
# attach 进入容器正在执行的终端
[lixun@aliecs /]$ docker attach e7e8
[root@e7e8837a0363 /]# ls
# bin etc lib lost+found mnt proc run srv tmp var
# dev home lib64 media opt root sbin sys usr
docker ps: 列出容器
# Usage: docker ps [OPTIONS]
# List containers
# Options:
# -a, --all Show all containers (default shows just running)
# -f, --filter filter Filter output based on conditions provided
# -q, --quiet Only display container IDs
# 运行的
[lixun@aliecs /]$ docker ps -a
# CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
# e7e8837a0363 centos "/bin/bash" 12 minutes ago Up 10 minutes docker_centos
# ALL
[lixun@aliecs /]$ docker ps -a
# CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
# 0ccbedd3924f hello-world "/hello" 4 minutes ago Exited (0) 4 minutes ago goofy_chebyshev
# e7e8837a0363 centos "/bin/bash" 19 minutes ago Up 16 minutes docker_centos
docker rm: 删除容器
# Usage: docker rm [OPTIONS] CONTAINER [CONTAINER...]
# Remove one or more containers
# Options:
# -f, --force Force the removal of a running container (uses SIGKILL)
# ID 能确定唯一一个的时候,可以省略后面的
[lixun@aliecs /]$ docker rm f01f02
# f01f02
docker start | restart : 启动容器
# Usage: docker start [OPTIONS] CONTAINER [CONTAINER...]
# Start one or more stopped containers
# Usage: docker restart [OPTIONS] CONTAINER [CONTAINER...]
# Restart one or more containers
docker start | restart : 停止容器
# Usage: docker stop [OPTIONS] CONTAINER [CONTAINER...]
# Stop one or more running containers
# Usage: docker kill [OPTIONS] CONTAINER [CONTAINER...]
# Kill one or more running containers
其他常用命令
docker run -d
[lixun@aliecs ~]$ docker run -d centos
# eff9e88cae00d02f8d3d79270b088a0b624087f36a5473086f13b9ab5b682c0c
# 发现 centos 停止了
# [lixun@aliecs ~]$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
# [注意]:docker 容器使用后天运行,就必须要有一个前台进程,docker 发现没有应用,就会自动停止
docker logs : 查看日志
# Usage: docker logs [OPTIONS] CONTAINER
# Fetch the logs of a container
# Options:
# -f, --follow Follow log output
# -n, --tail string Number of lines to show from the end of the logs (default "all")
# -t, --timestamps Show timestamps
[lixun@aliecs ~]$ docker logs nginx -n 10 -t
# 2022-04-13T05:12:44.976028040Z /docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
# 2022-04-13T05:12:44.976078133Z /docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/2022-04-13T05:12:44.982263106Z /docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
# 2022-04-13T05:12:44.998960474Z 10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf
# 2022-04-13T05:12:45.013403856Z 10-listen-on-ipv6-by-default.sh: info: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf
# 2022-04-13T05:12:45.013428008Z /docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
# 2022-04-13T05:12:45.017048794Z /docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh
# 2022-04-13T05:12:45.018499309Z /docker-entrypoint.sh: Configuration complete; ready for start up
docker ps: 查看容器进程信息
# Usage: docker top CONTAINER [ps OPTIONS]
# Display the running processes of a container
[lixun@aliecs ~]$ docker top nginx
# UID PID PPID C STIME TTY TIME CMD
# root 3561006 3560988 0 Apr13 ? 00:00:00 nginx: master process nginx -g daemon off;
# 101 3561057 3561006 0 Apr13 ? 00:00:00 nginx: worker process
docker inspect: 查看容器信息
# Usage: docker inspect [OPTIONS] NAME|ID [NAME|ID...]
# Return low-level information on Docker objects
# Options:
# -f, --format string Format the output using the given Go template
[lixun@aliecs ~]$ docker inspect nginx
# [
# {
# "Id": "bba6a4b9a5726006a29cb02c687c0331883eb2d582df88a3438fc3cc09159518",
# "Created": "2022-04-13T05:12:44.23192873Z",
# "Path": "/docker-entrypoint.sh",
# "Args": [
# "nginx",
# "-g",
# "daemon off;"
# ],
# "State": {
# "Status": "running",
# "Running": true,
# "Paused": false,
# "Restarting": false,
# "OOMKilled": false,
# "Dead": false,
# "Pid": 3561006,
# "ExitCode": 0,
# "Error": "",
# "StartedAt": "2022-04-13T05:12:44.929720623Z",
# "FinishedAt": "0001-01-01T00:00:00Z"
# },
# "Image": "sha256:605c77e624ddb75e6110f997c58876baa13f8754486b461117934b24a9dc3a85",
# "ResolvConfPath": "/var/lib/docker/containers/bba6a4b9a5726006a29cb02c687c0331883eb2d582df88a3438fc3cc09159518/resolv.conf",
# "HostnamePath": "/var/lib/docker/containers/bba6a4b9a5726006a29cb02c687c0331883eb2d582df88a3438fc3cc09159518/hostname",
# "HostsPath": "/var/lib/docker/containers/bba6a4b9a5726006a29cb02c687c0331883eb2d582df88a3438fc3cc09159518/hosts",
# "LogPath": "/var/lib/docker/containers/bba6a4b9a5726006a29cb02c687c0331883eb2d582df88a3438fc3cc09159518/bba6a4b9a5726006a29cb02c687c0331883eb2d582df88a3438fc3cc09159518-json.log",
# "Name": "/nginx",
# "RestartCount": 0,
# "Driver": "overlay2",
# "Platform": "linux",
# "MountLabel": "",
# "ProcessLabel": "",
# "AppArmorProfile": "",
# "ExecIDs": null,
# "HostConfig": {
# "Binds": [
# "/home/lixun/nginx/www:/usr/share/nginx/html",
# "/home/lixun/nginx/conf/nginx.conf:/etc/nginx/nginx.conf",
# "/home/lixun/nginx/logs:/var/log/nginx"
# ],
# "ContainerIDFile": "",
# "LogConfig": {
# "Type": "json-file",
# "Config": {}
# },
# "NetworkMode": "default",
# "PortBindings": {
# "80/tcp": [
# {
# "HostIp": "",
# "HostPort": "6203"
# }
# ]
# },
# "RestartPolicy": {
# "Name": "no",
# "MaximumRetryCount": 0
# },
# "AutoRemove": true,
# "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/d80d163f4b9045b6911aaa8981bbb70b0d8debc6870210718b7e3c32a6f886ca-init/diff:/var/lib/docker/overlay2/79a03c67449efe18e3e9105f863a8e4ba81ae1a4b04ace16a968209dc43a35c0/diff:/var/lib/docker/overlay2/6d904ff6e200aebe24a95a821e789ce098fec352fed00bffbf9550241bb11325/diff:/var/lib/docker/overlay2/7350d8179cbd3c0eacd5db5a3b0388d7f75d3ec61de118bf6513730a86b2b7ed/diff:/var/lib/docker/overlay2/bb4a102a2d8f29cfc21032cbd685ea05241998c8894f92cd41f604527e84c867/diff:/var/lib/docker/overlay2/aad36878d63972d28a992e0816fce1b451545592bc1b405e0aeb9cc5dd2605da/diff:/var/lib/docker/overlay2/6da0630914ffb81f76737df0b3b0e1c1244ae54cfd28d653898676997663e911/diff",
# "MergedDir": "/var/lib/docker/overlay2/d80d163f4b9045b6911aaa8981bbb70b0d8debc6870210718b7e3c32a6f886ca/merged",
# "UpperDir": "/var/lib/docker/overlay2/d80d163f4b9045b6911aaa8981bbb70b0d8debc6870210718b7e3c32a6f886ca/diff",
# "WorkDir": "/var/lib/docker/overlay2/d80d163f4b9045b6911aaa8981bbb70b0d8debc6870210718b7e3c32a6f886ca/work"
# },
# "Name": "overlay2"
# },
# "Mounts": [
# {
# "Type": "bind",
# "Source": "/home/lixun/nginx/www",
# "Destination": "/usr/share/nginx/html",
# "Mode": "",
# "RW": true,
# "Propagation": "rprivate"
# },
# {
# "Type": "bind",
# "Source": "/home/lixun/nginx/conf/nginx.conf",
# "Destination": "/etc/nginx/nginx.conf",
# "Mode": "",
# "RW": true,
# "Propagation": "rprivate"
# },
# {
# "Type": "bind",
# "Source": "/home/lixun/nginx/logs",
# "Destination": "/var/log/nginx",
# "Mode": "",
# "RW": true,
# "Propagation": "rprivate"
# }
# ],
# "Config": {
# "Hostname": "bba6a4b9a572",
# "Domainname": "",
# "User": "",
# "AttachStdin": false,
# "AttachStdout": false,
# "AttachStderr": false,
# "ExposedPorts": {
# "80/tcp": {}
# },
# "Tty": false,
# "OpenStdin": false,
# "StdinOnce": false,
# "Env": [
# "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
# "NGINX_VERSION=1.21.5",
# "NJS_VERSION=0.7.1",
# "PKG_RELEASE=1~bullseye"
# ],
# "Cmd": [
# "nginx",
# "-g",
# "daemon off;"
# ],
# "Image": "nginx",
# "Volumes": null,
# "WorkingDir": "",
# "Entrypoint": [
# "/docker-entrypoint.sh"
# ],
# "OnBuild": null,
# "Labels": {
# "maintainer": "NGINX Docker Maintainers <docker-maint@nginx.com>"
# },
# "StopSignal": "SIGQUIT"
# },
# "NetworkSettings": {
# "Bridge": "",
# "SandboxID": "e3a0ccdb0bba851da103f0bd00bb1e933f551b36b701b18e00b01573bac6168b",
# "HairpinMode": false,
# "LinkLocalIPv6Address": "",
# "LinkLocalIPv6PrefixLen": 0,
# "Ports": {
# "80/tcp": [
# {
# "HostIp": "0.0.0.0",
# "HostPort": "6203"
# },
# {
# "HostIp": "::",
# "HostPort": "6203"
# }
# ]
# },
# "SandboxKey": "/var/run/docker/netns/e3a0ccdb0bba",
# "SecondaryIPAddresses": null,
# "SecondaryIPv6Addresses": null,
# "EndpointID": "1d7b07de666ebebf7a1b22300010559b1522b6c22a3c0a92580e7c27ae884ca6",
# "Gateway": "172.17.0.1",
# "GlobalIPv6Address": "",
# "GlobalIPv6PrefixLen": 0,
# "IPAddress": "172.17.0.3",
# "IPPrefixLen": 16,
# "IPv6Gateway": "",
# "MacAddress": "02:42:ac:11:00:03",
# "Networks": {
# "bridge": {
# "IPAMConfig": null,
# "Links": null,
# "Aliases": null,
# "NetworkID": "45d7ef54759370db4f3d6be01c20731ae8124778aa8a1a2861aeac375ae5fc5d",
# "EndpointID": "1d7b07de666ebebf7a1b22300010559b1522b6c22a3c0a92580e7c27ae884ca6",
# "Gateway": "172.17.0.1",
# "IPAddress": "172.17.0.3",
# "IPPrefixLen": 16,
# "IPv6Gateway": "",
# "GlobalIPv6Address": "",
# "GlobalIPv6PrefixLen": 0,
# "MacAddress": "02:42:ac:11:00:03",
# "DriverOpts": null
# }
# }
# }
# }
# ]
docker cp: 从容器中拷贝文件
# Usage: docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-
# docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH
# Copy files/folders between a container and the local filesystem
# Use '-' as the source to read a tar archive from stdin
# and extract it to a directory destination in a container.
# Use '-' as the destination to stream a tar archive of a
# container source to stdout.
[lixun@aliecs docker]$ docker cp $(docker ps -q -f name=docker_centos):/home/docker/Main.java ./
[lixun@aliecs docker]$ ls
# Hello.java Main.java
[lixun@aliecs docker]$ cat Main.java
# public class Main {
# public static void main(String[] args) {
# System.out.println("Hello, Docker CentOS!");
# }
# }
小结

# 当前 shell 下 attach 连接指定运行镜像
# attach Attach to a running container
# 通过 Dockerfile 定制镜像
# build Build an image from a Dockerfile
# 提交当前容器为新的镜像
# commit Create a new image from a container's changes
# 从容器中拷贝指定文件或者目录到宿主机中
# cp Copy files/folders from a container to a HOSTDIR or to STDOUT
# 创建一个新的容器,同 run 但不启动容器
# create Create a new container
# 查看 docker 容器变化
# diff Inspect changes on a container's filesystem
# 从 docker 服务获取容器实时事件
# events Get real time events from the server
# 在已存在的容器上运行命令
# exec Run a command in a running container
# 导出容器的内容流作为一个 tar 归档文件(对应 import)
# export Export a container's filesystem as a tar archive
# 展示一个镜像形成历史
# history Show the history of an image
# 列出系统当前镜像
# images List images
# 从 tar 包中的内容创建一个新的文件系统映像(对应 export)
# import Import the contents from a tarball to create a filesystem image
# 显示系统相关信息
# info Display system-wide information
# 查看容器详细信息
# inspect Return low-level information on a container or image
# kill 指定 docker 容器
# kill Kill a running container
# 从一个 tar 包中加载一个镜像(对应 save)
# load Load an image from a tar archive or STDIN
# 注册或者登陆一个 docker 源服务器
# login Register or log in to a Docker registry
# 从当前 Docker registry 退出
# logout Log out from a Docker registry
# 输出当前容器日志信息
# logs Fetch the logs of a container
# 暂停容器
# pause Pause all processes within a container
# 查看映射端口对应的容器内部源端口
# port List port mappings or a specific mapping for the CONTAINER
# 列出容器列表
# ps List containers
# 从 docker 镜像源服务器拉取指定镜像或者库镜像
# pull Pull an image or a repository from a registry
# 推送指定镜像或者库镜像至 docker 源服务器
# push Push an image or a repository to a registry
# 重命名容器
# rename Rename a container
# 重启运行的容器
# restart Restart a running container
# 移除一个或者多个容器
# rm Remove one or more containers
# 移除一个或多个镜像(无容器使用该镜像才可以删除,否则需要删除相关容器才可以继续或者 -f 强制删除)
# rmi Remove one or more images
# 创建一个新的容器并运行一个命令
# run Run a command in a new container
# 保存一个镜像为一个 tar 包(对应 load)
# save Save an image(s) to a tar archive
# 在 docker hub 中搜索镜像
# 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 a running container
# 给源中镜像打标签
# tag Tag an image into a repository
# 查看容器中运行的进程信息
# top Display the running processes of a container
# 取消暂停容器
# unpause Unpause all processes within a container
# 查看容器版本号
# version Show the Docker version information
# 截取容器停止时的退出状态值
# wait Block until a container stops, then print its exit code
Exercise
安装 Nginx
# 1.search
[lixun@aliecs ~]$ docker search nginx -f stars=1000
# NAME DESCRIPTION STARS OFFICIAL AUTOMATED
# nginx Official build of Nginx. 17006 [OK]
# 2.pull
[lixun@aliecs ~]$ docker pull nginx
# Using default tag: latest
# latest: Pulling from library/nginx
# a2abf6c4d29d: Already exists
# a9edb18cadd1: Pull complete
# 589b7251471a: Pull complete
# 186b1aaa4aa6: Pull complete
# b4df32aa5a72: Pull complete
# a0bcbecc962e: Pull complete
# Digest: sha256:0d17b565c37bcbd895e9d92315a05c1c3c9a29f762b011a10c54a66cd53c9b31
# Status: Downloaded newer image for nginx:latest
# docker.io/library/nginx:latest
# 3.run
[lixun@aliecs ~]$ docker run -d --name nginx -p 6200:80 nginx
# 4c0dbb4322be3abf0d6ef4d6c89ec236b1f19281f16c77d8314742086f3efb91
[lixun@aliecs ~]$ docker ps
# CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
# 4c0dbb4322be nginx "/docker-entrypoint.…" 2 seconds ago Up 1 second 0.0.0.0:6200->80/tcp, :::6200->80/tcp nginx
# 4.test
[lixun@aliecs ~]$ curl localhost:6200
# <!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>
# 5.nginx
[lixun@aliecs ~]$ docker exec -it nginx /bin/bash
root@4c0dbb4322be:/# whereis nginx
# nginx: /usr/sbin/nginx /usr/lib/nginx /etc/nginx /usr/share/nginx
安装 Tomcat
[lixun@aliecs docker]$ docker search tomcat -f stars=1000
# NAME DESCRIPTION STARS OFFICIAL AUTOMATED
# tomcat Apache Tomcat is an open source implementati… 3345 [OK]
[lixun@aliecs docker]$ docker pull tomcat
# Using default tag: latest
# latest: Pulling from library/tomcat
# 0e29546d541c: Pull complete
# 9b829c73b52b: Pull complete
# cb5b7ae36172: Pull complete
# 6494e4811622: Pull complete
# 668f6fcc5fa5: Pull complete
# dc120c3e0290: Pull complete
# 8f7c0eebb7b1: Pull complete
# 77b694f83996: Pull complete
# 0f611256ec3a: Pull complete
# 4f25def12f23: Pull complete
# Digest: sha256:9dee185c3b161cdfede1f5e35e8b56ebc9de88ed3a79526939701f3537a52324
# Status: Downloaded newer image for tomcat:latest
# docker.io/library/tomcat:latest
[lixun@aliecs docker]$ docker run -d --name tomcat -p 6201:8080 tomcat
# cb14f941e36d8f99915c61da2280d9c7afa79b61b8bd5a05946e2a9311236202
# 测试发现 404
[lixun@aliecs docker]$ curl localhost:6201
# <!doctype html><html lang="en"><head><title>HTTP Status 404 – Not Found</title><style type="text/css">body {font-family:Tahoma,Arial,sans-serif;} h1, h2, h3, b {color:white;background-color:#525D76;} h1 {font-size:22px;} h2 {font-size:16px;} h3 {font-size:14px;} p {font-size:12px;} a {color:black;} .line {height:1px;background-color:#525D76;border:none;}</style></head><body><h1>HTTP Status 404 – Not Found</h1><hr class="line" /><p><b>Type</b> Status Report</p><p><b>Description</b> The origin server did not find a current representation for the target resource or is not willing to disclose that one exists.</p><hr class="line" /><h3>Apache Tomcat/10.0.14</h3></body></html>
# 查看 tomcat 文件
[lixun@aliecs docker]$ docker exec -it tomcat /bin/bash
root@cb14f941e36d:/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@cb14f941e36d:/usr/local/tomcat# ls webapps -l
total 0
# 将 webapps.dist 复制到 webapps 下即可
root@cb14f941e36d:/usr/local/tomcat/# cp -r webapps.dist/* webapps
[lixun@aliecs docker]$ curl localhost:6201
# <!DOCTYPE html>
# <html lang="en">
# <head>
# <meta charset="UTF-8" />
# <title>Apache Tomcat/10.0.14</title>
# <link href="favicon.ico" rel="icon" type="image/x-icon" />
# <link href="tomcat.css" rel="stylesheet" type="text/css" />
# </head>
# <body>
# <div id="wrapper">
# <div id="navigation" class="curved container">
# <span id="nav-home"><a href="https://tomcat.apache.org/">Home</a></span>
# <span id="nav-hosts"><a href="/docs/">Documentation</a></span>
# <span id="nav-config"><a href="/docs/config/">Configuration</a></span>
# <span id="nav-examples"><a href="/examples/">Examples</a></span>
# <span id="nav-wiki"><a href="https://wiki.apache.org/tomcat/FrontPage">Wiki</a></span>
# <span id="nav-lists"><a href="https://tomcat.apache.org/lists.html">Mailing Lists</a></span>
# <span id="nav-help"><a href="https://tomcat.apache.org/findhelp.html">Find Help</a></span>
# <br class="separator" />
# </div>
# <div id="asf-box">
# <h1>Apache Tomcat/10.0.14</h1>
# </div>
# <div id="upper" class="curved container">
# <div id="congrats" class="curved container">
# <h2>If you're seeing this, you've successfully installed Tomcat. Congratulations!</h2>
# </div>
# <div id="notice">
# <img id="tomcat-logo" src="tomcat.svg" alt="[tomcat logo]" />
# <div id="tasks">
# <h3>Recommended Reading:</h3>
# <h4><a href="/docs/security-howto.html">Security Considerations How-To</a></h4>
# <h4><a href="/docs/manager-howto.html">Manager Application How-To</a></h4>
# <h4><a href="/docs/cluster-howto.html">Clustering/Session Replication How-To</a></h4>
# </div>
# </div>
# <div id="actions">
# <div class="button">
# <a class="container shadow" href="/manager/status"><span>Server Status</span></a>
# </div>
# <div class="button">
# <a class="container shadow" href="/manager/html"><span>Manager App</span></a>
# </div>
# <div class="button">
# <a class="container shadow" href="/host-manager/html"><span>Host Manager</span></a>
# </div>
# </div>
# <br class="separator" />
# </div>
# <div id="middle" class="curved container">
# <h3>Developer Quick Start</h3>
# <div class="col25">
# <div class="container">
# <p><a href="/docs/setup.html">Tomcat Setup</a></p>
# <p><a href="/docs/appdev/">First Web Application</a></p>
# </div>
# </div>
# <div class="col25">
# <div class="container">
# <p><a href="/docs/realm-howto.html">Realms & AAA</a></p>
# <p><a href="/docs/jndi-datasource-examples-howto.html">JDBC DataSources</a></p>
# </div>
# </div>
# <div class="col25">
# <div class="container">
# <p><a href="/examples/">Examples</a></p>
# </div>
# </div>
# <div class="col25">
# <div class="container">
# <p><a href="https://wiki.apache.org/tomcat/Specifications">Servlet Specifications</a></p>
# <p><a href="https://wiki.apache.org/tomcat/TomcatVersions">Tomcat Versions</a></p>
# </div>
# </div>
# <br class="separator" />
# </div>
# <div id="lower">
# <div id="low-manage" class="">
# <div class="curved container">
# <h3>Managing Tomcat</h3>
# <p>For security, access to the <a href="/manager/html">manager webapp</a> is restricted.
# Users are defined in:</p>
# <pre>$CATALINA_HOME/conf/tomcat-users.xml</pre>
# <p>In Tomcat 10.0 access to the manager application is split between
# different users. <a href="/docs/manager-howto.html">Read more...</a></p>
# <br />
# <h4><a href="/docs/RELEASE-NOTES.txt">Release Notes</a></h4>
# <h4><a href="/docs/changelog.html">Changelog</a></h4>
# <h4><a href="https://tomcat.apache.org/migration.html">Migration Guide</a></h4>
# <h4><a href="https://tomcat.apache.org/security.html">Security Notices</a></h4>
# </div>
# </div>
# <div id="low-docs" class="">
# <div class="curved container">
# <h3>Documentation</h3>
# <h4><a href="/docs/">Tomcat 10.0 Documentation</a></h4>
# <h4><a href="/docs/config/">Tomcat 10.0 Configuration</a></h4>
# <h4><a href="https://wiki.apache.org/tomcat/FrontPage">Tomcat Wiki</a></h4>
# <p>Find additional important configuration information in:</p>
# <pre>$CATALINA_HOME/RUNNING.txt</pre>
# <p>Developers may be interested in:</p>
# <ul>
# <li><a href="https://tomcat.apache.org/bugreport.html">Tomcat 10.0 Bug Database</a></li>
# <li><a href="/docs/api/index.html">Tomcat 10.0 JavaDocs</a></li>
# <li><a href="https://github.com/apache/tomcat/tree/10.0.x">Tomcat 10.0 Git Repository at GitHub</a></li>
# </ul>
# </div>
# </div>
# <div id="low-help" class="">
# <div class="curved container">
# <h3>Getting Help</h3>
# <h4><a href="https://tomcat.apache.org/faq/">FAQ</a> and <a href="https://tomcat.apache.org/lists.html">Mailing Lists</a></h4>
# <p>The following mailing lists are available:</p>
# <ul>
# <li id="list-announce"><strong><a href="https://tomcat.apache.org/lists.html#tomcat-announce">tomcat-announce</a><br />
# Important announcements, releases, security vulnerability notifications. (Low volume).</strong>
# </li>
# <li><a href="https://tomcat.apache.org/lists.html#tomcat-users">tomcat-users</a><br />
# User support and discussion
# </li>
# <li><a href="https://tomcat.apache.org/lists.html#taglibs-user">taglibs-user</a><br />
# User support and discussion for <a href="https://tomcat.apache.org/taglibs/">Apache Taglibs</a>
# </li>
# <li><a href="https://tomcat.apache.org/lists.html#tomcat-dev">tomcat-dev</a><br />
# Development mailing list, including commit messages
# </li>
# </ul>
# </div>
# </div>
# <br class="separator" />
# </div>
# <div id="footer" class="curved container">
# <div class="col20">
# <div class="container">
# <h4>Other Downloads</h4>
# <ul>
# <li><a href="https://tomcat.apache.org/download-connectors.cgi">Tomcat Connectors</a></li>
# <li><a href="https://tomcat.apache.org/download-native.cgi">Tomcat Native</a></li>
# <li><a href="https://tomcat.apache.org/taglibs/">Taglibs</a></li>
# <li><a href="/docs/deployer-howto.html">Deployer</a></li>
# </ul>
# </div>
# </div>
# <div class="col20">
# <div class="container">
# <h4>Other Documentation</h4>
# <ul>
# <li><a href="https://tomcat.apache.org/connectors-doc/">Tomcat Connectors</a></li>
# <li><a href="https://tomcat.apache.org/connectors-doc/">mod_jk Documentation</a></li>
# <li><a href="https://tomcat.apache.org/native-doc/">Tomcat Native</a></li>
# <li><a href="/docs/deployer-howto.html">Deployer</a></li>
# </ul>
# </div>
# </div>
# <div class="col20">
# <div class="container">
# <h4>Get Involved</h4>
# <ul>
# <li><a href="https://tomcat.apache.org/getinvolved.html">Overview</a></li>
# <li><a href="https://tomcat.apache.org/source.html">Source Repositories</a></li>
# <li><a href="https://tomcat.apache.org/lists.html">Mailing Lists</a></li>
# <li><a href="https://wiki.apache.org/tomcat/FrontPage">Wiki</a></li>
# </ul>
# </div>
# </div>
# <div class="col20">
# <div class="container">
# <h4>Miscellaneous</h4>
# <ul>
# <li><a href="https://tomcat.apache.org/contact.html">Contact</a></li>
# <li><a href="https://tomcat.apache.org/legal.html">Legal</a></li>
# <li><a href="https://www.apache.org/foundation/sponsorship.html">Sponsorship</a></li>
# <li><a href="https://www.apache.org/foundation/thanks.html">Thanks</a></li>
# </ul>
# </div>
# </div>
# <div class="col20">
# <div class="container">
# <h4>Apache Software Foundation</h4>
# <ul>
# <li><a href="https://tomcat.apache.org/whoweare.html">Who We Are</a></li>
# <li><a href="https://tomcat.apache.org/heritage.html">Heritage</a></li>
# <li><a href="https://www.apache.org">Apache Home</a></li>
# <li><a href="https://tomcat.apache.org/resources.html">Resources</a></li>
# </ul>
# </div>
# </div>
# <br class="separator" />
# </div>
# <p class="copyright">Copyright ©1999-2022 Apache Software Foundation. All Rights Reserved</p>
# </div>
# </body>
# </html>
可视化 portainer-ce
# 1.docker search
[lixun@aliecs ~]$ docker search portainer -f stars=1000
# NAME DESCRIPTION STARS OFFICIAL AUTOMATED
# portainer/portainer This Repo is now deprecated, use portainer/p… 2235
# portainer/portainer-ce Portainer CE - a lightweight service deliver… 1206
# 2.docker pull
[lixun@aliecs ~]$ docker pull portainer/portainer-ce
# Using default tag: latest
# latest: Pulling from portainer/portainer-ce
# 0ea73420e2bb: Pull complete
# c367f59be2e1: Pull complete
# b71b88d796e2: Pull complete
# Digest: sha256:4f126c5114b63e9d1bceb4b368944d14323329a9a0d4e7bb7eb53c9b7435d498
# Status: Downloaded newer image for portainer/portainer-ce:latest
# docker.io/portainer/portainer-ce:latest
# 3.docker run
[lixun@aliecs /]$ docker run -d -p 6211:8000 -p 6212:9443 --name portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce
# 499b255f0e3673c0bef1fd3311df8742a2919236278cc7692af2933e98ad595a
[lixun@aliecs /]$ docker ps
# CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
# 499b255f0e36 portainer/portainer-ce "/portainer" 5 seconds ago Up 4 seconds 9000/tcp, 0.0.0.0:6211->8000/tcp, :::6211->8000/tcp, 0.0.0.0:6212->9443/tcp, :::6212->9443/tcp portainer

Docker 镜像
镜像是什么
镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码、运行时、库、环境变量和配置文件。
所有的应用,直接打包 docker 镜像,就可以直接跑起来!
如何得到镜像:
- Docker Hub 下载
- DockerFile 制作
Docker 镜像加载原理
UnionFS(联合文件系统)
联合文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下。联合文件系统是 Docker 镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
特性:一次同时加载多个文件系统,但从外面看起来只能看到一个文件系统。联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录。
Docker 镜像加载原理
Docker 的镜像实际由一层一层的文件系统组成:
- bootfs(boot file system)主要包含 bootloader 和 kernel。bootloader 主要是引导加载 kernel,完成后整个内核就都在内存中了。此时内存的使用权已由 bootfs 转交给内核,系统卸载 bootfs。可以被不同的 Linux 发行版公用。
- rootfs(root file system),包含典型 Linux 系统中的/dev,/proc,/bin,/etc 等标准目录和文件。rootfs 就是各种不同操作系统发行版(Ubuntu,Centos 等)。因为底层直接用 Host 的 kernel,rootfs 只包含最基本的命令,工具和程序就可以了。
- 分层理解
所有的 Docker 镜像都起始于一个基础镜像层,当进行修改或增加新的内容时,就会在当前镜像层之上,创建新的容器层。
容器在启动时会在镜像最外层上建立一层可读写的容器层(R/W),而镜像层是只读的(R/O)。

提交镜像
[lixun@aliecs ~]$ docker run -d -p 6201:8080 --name tomcat tomcat
# 05b29d1bcc58702cfa3c7e8421a3254fbcc83bd2d9358af12faf3b54feb02cf1
[lixun@aliecs ~]$ docker exec -it tomcat /bin/bash
root@05b29d1bcc58:/usr/local/tomcat# ls
# BUILDING.txt LICENSE README.md RUNNING.txt conf logs temp work
# CONTRIBUTING.md NOTICE RELEASE-NOTES bin lib native-jni-lib webapps.dist
root@05b29d1bcc58:/usr/local/tomcat# mv webapps.dist webapps
root@05b29d1bcc58:/usr/local/tomcat# ls
# BUILDING.txt LICENSE README.md RUNNING.txt conf logs temp work
# CONTRIBUTING.md NOTICE RELEASE-NOTES bin lib native-jni-lib webapps
[lixun@aliecs ~]$ docker ps
# CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
# cb14f941e36d tomcat "catalina.sh run" 5 hours ago Up 3 minutes 0.0.0.0:6201->8080/tcp, :::6201->8080/tcp
[lixun@aliecs ~]$ docker commit -a "lixun" -m "webapps.dist renamed webapps" 05b29d1bcc58 my_tomcat:1.0
# sha256:cc55275594cde1deb6b455ee4da60a6d2b1ffae3116fac51edf49cefdd0ec5c0
[lixun@aliecs ~]$ docker images
# REPOSITORY TAG IMAGE ID CREATED SIZE
# my_tomcat 1.0 cc55275594cd 20 seconds ago 684MB
# tomcat latest fb5657adc892 6 months ago 680MB
数据卷
# docker
[lixun@aliecs ~]$ docker run -it -v /home/lixun/docker/test_volume:/home/docker/test_volume centos /bin/bash
[root@464d88fad400 /]# cd /home/docker/test_volume
[root@464d88fad400 test_volume]# echo Hello,Volume > volume.txt
# linux
[lixun@aliecs ~]$ cd docker/test_volume/
[lixun@aliecs test_volume]$ cat volume.txt
Hello,Volume