目录
[TOC]
1. 简介
Docker是GO语言实现的开源项目,基于Linux容器技术
,主要目标是一次封装,到处运行
。
应用部署在Docker容器上,Docker容器在任何操作系统上都是一致的
,因此实现了跨平台、跨服务器的部署(和Java虚拟机的理念类似)。
1.1 出现的原因
软件带环境安装
,避免软更换环境后与环境的不兼容(开发环境->测试环境->生产环境->生产环境的集群发布)。
减少开人员与运维人员之间沟通的障碍,提高协作能力;微服务环境下,运维人员可快速得进行软件的部署,。
1.2 与传统虚拟化方式的区别
- 传统的虚拟机技术是在宿主中
模拟出一套硬件
后,在上面运行一个完整
的操作系统,在操作系统上运行自己需要的软件进程。当前宿主无法感知运行的系统。缺点:占用资源多、冗余步骤多、启动慢。 - Docker基于Linux容器技术(
LXC
),容器内的应用进程直接运行于宿主的内核
,每个容器有自己的文件系统,容器之间的进程不会互相影响
,容器没有自己的内核和硬件虚拟。容器比传统虚拟机更为轻便。
1.3 优点
-
更快速的应用交付和部署
Docker化之后,发布应用,
只需要交付容器镜像环境,在新环境加载镜像运行
即可。节省了部署以及部署后的验证时间。 -
更便捷的升级和扩缩容
微服务器架构模式下,需要重复发布大量的应用。Docker容器发布的快捷(发布简单、执行速度快),
能支持微服务架构下的快速升级和扩容
。 -
更简单的系统运维
容器话后,容器在任何一个系统的运行结果都是一样的,
减少了因底层环境问题导致的应用问题
,保障了应用的稳定性。 -
更高效的资源利用
Docker容器化之后,
不需要独立的物理机或者虚拟机进行环境部署
,只依赖宿主机内的被隔离的进程。大大减少了对系统资源的额外消耗。
1.4 相关网址
[官网 https://www.docker.com][https://www.docker.com]
仓库 https://hub.docker.com
1.5 名词解释
-
镜像
镜像是一个
只读
的模板
,一个镜像可以创建很多容器。类似于Java中的类。 -
容器
容器是通过镜像创建的运行实例,在容器上独立运行一个或一组应用。
每个容器都是相互隔离的。
可以把容器看做一个简易版的Linux环境+运行在上面的程序。
容器是
可读可写
的。 -
仓库
仓库是集中存放镜像文件的场所,可以下载和提交镜像。最大的仓库是
Dock Hub
。
2. Docker的安装
2.1 版本说明
Centos 7.3.1611
查看版本相关命令:
- 查看centos版本号
[root@localhost etc]# cat /etc/centos-release
CentOS Linux release 7.3.1611 (Core)
- 查看内核版本
[root@localhost etc]# uname -r
3.10.0-514.el7.x86_64
- 查看操作系统位数
[root@localhost etc]# getconf LONG_BIT
64
2.2 官方文档
centos安装Docker
2.3 安装步骤(首次安装-社区版)
如之前安装过,需参照官网进行卸载。
(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
(3)更新yum软件包索引
yum makecache fast
(4)安装docker ce(社区版)
yum install docker-ce docker-ce-cli containerd.io
(5)启动docker
systemctl start docker
(6)测试
docker version
docker run hello-world
2.4 配置镜像加速
(1)创建目录
mkdir -p /etc/docker
(2)创建及配置文件
vim /etc/docker/daemon.json
文件中配置以下内容:
{
"registry-mirrors": ["http://hub-mirror.c.163.com"]
}
(3)重新加载服务配置文件
systemctl daemon-reload
(4)重启docker
systemctl restart docker
(5)检查加速器是否生效
docker info
如出现如下内容,则说明配置生效:
Registry Mirrors:
http://hub-mirror.c.163.com/
3. Docker常用命令
3.1 帮助命令
#查看版本
docker version
#查看信息
docker info
#查看帮助信息
docker --help
3.2 镜像命令
3.1.1 docker images
(1)用途
列出本地主机上的镜像
[root@localhost etc]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest fce289e99eb9 10 months ago 1.84kB
(2)各个选项说明
REPOSITORY:表示镜像的仓库源
TAG:镜像的标签
IMAGE ID:镜像ID
CREATED:镜像创建时间
SIZE:镜像大小
查看帮助:
(3)查看帮助
[root@localhost etc]# docker --help images
Usage: docker images [OPTIONS] [REPOSITORY[:TAG]]
List images
Options:
-a, --all Show all images (default hides intermediate images)
--digests Show digests
-f, --filter filter Filter output based on conditions provided
--format string Pretty-print images using a Go template
--no-trunc Don't truncate output
-q, --quiet Only show numeric IDs
(4)Options说明
-a:列出本地所有的镜像(含中间映像层)
-q:只显示镜像ID
--digests:显示镜像的摘要信息
--no-trunc:显示完整的镜像信息
3.1.2 docker search 某个镜像名字
(1)用途
查询仓库内的镜像。查询网址:http://hub.docker.com
(2)命令模板
docker search [OPTIONS] 镜像名字
(3)查看帮助
[root@localhost ~]# docker --help search
Usage: docker search [OPTIONS] TERM
Search the Docker Hub for images
Options:
-f, --filter filter Filter output based on conditions provided
--format string Pretty-print search using a Go template
--limit int Max number of search results (default 25)
--no-trunc Don't truncate output
(3)OPTIONS说明:
--no-trunc : 显示完整的镜像描述
-s : 列出收藏数不小于指定值的镜像。
--automated : 只列出 automated build类型的镜像;
3.1.3 docker pull 某个镜像的名字
(1)用途
下载镜像
(2)模板
docker pull 镜像名字[:TAG]
(3)查看帮助
[root@localhost ~]# docker --help pull
Usage: docker pull [OPTIONS] NAME[:TAG|@DIGEST]
Pull an image or a repository from a registry
Options:
-a, --all-tags Download all tagged images in the repository
--disable-content-trust Skip image verification (default true)
-q, --quiet Suppress verbose output
3.1.4 docker rmi 某个镜像id
(1)用途
删除镜像
(2)查看帮助
[root@localhost ~]# docker --help 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
(3)命令模板
-
删除单个
docker rim -f 镜像ID
-
删除多个
docker rmi -f 镜像名1:TAG 镜像名2:TAG
-
删除全部
docker rmi -f $(docker images -qa)
3.3 容器命令
3.3.1 docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
(1)用途
新建并启动容器
(2)查看帮助
[root@localhost ~]# docker run --help
Usage: docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
Run a command in a new container
Options:
--add-host list Add a custom host-to-IP mapping (host:ip)
-a, --attach list Attach to STDIN, STDOUT or STDERR
--blkio-weight uint16 Block IO (relative weight), between 10 and 1000, or 0 to
disable (default 0)
--blkio-weight-device list Block IO weight (relative device weight) (default [])
--cap-add list Add Linux capabilities
--cap-drop list Drop Linux capabilities
--cgroup-parent string Optional parent cgroup for the container
--cidfile string Write the container ID to the file
--cpu-period int Limit CPU CFS (Completely Fair Scheduler) period
--cpu-quota int Limit CPU CFS (Completely Fair Scheduler) quota
--cpu-rt-period int Limit CPU real-time period in microseconds
--cpu-rt-runtime int Limit CPU real-time runtime in microseconds
-c, --cpu-shares int CPU shares (relative weight)
--cpus decimal Number of CPUs
--cpuset-cpus string CPUs in which to allow execution (0-3, 0,1)
--cpuset-mems string MEMs in which to allow execution (0-3, 0,1)
-d, --detach Run container in background and print container ID
--detach-keys string Override the key sequence for detaching a container
--device list Add a host device to the container
--device-cgroup-rule list Add a rule to the cgroup allowed devices list
--device-read-bps list Limit read rate (bytes per second) from a device (default [])
--device-read-iops list Limit read rate (IO per second) from a device (default [])
--device-write-bps list Limit write rate (bytes per second) to a device (default [])
--device-write-iops list Limit write rate (IO per second) to a device (default [])
--disable-content-trust Skip image verification (default true)
--dns list Set custom DNS servers
--dns-option list Set DNS options
--dns-search list Set custom DNS search domains
--domainname string Container NIS domain name
--entrypoint string Overwrite the default ENTRYPOINT of the image
-e, --env list Set environment variables
--env-file list Read in a file of environment variables
--expose list Expose a port or a range of ports
--gpus gpu-request GPU devices to add to the container ('all' to pass all GPUs)
--group-add list Add additional groups to join
--health-cmd string Command to run to check health
--health-interval duration Time between running the check (ms|s|m|h) (default 0s)
--health-retries int Consecutive failures needed to report unhealthy
--health-start-period duration Start period for the container to initialize before
starting health-retries countdown (ms|s|m|h) (default 0s)
--health-timeout duration Maximum time to allow one check to run (ms|s|m|h) (default 0s)
--help Print usage
-h, --hostname string Container host name
--init Run an init inside the container that forwards signals
and reaps processes
-i, --interactive Keep STDIN open even if not attached
--ip string IPv4 address (e.g., 172.30.100.104)
--ip6 string IPv6 address (e.g., 2001:db8::33)
--ipc string IPC mode to use
--isolation string Container isolation technology
--kernel-memory bytes Kernel memory limit
-l, --label list Set meta data on a container
--label-file list Read in a line delimited file of labels
--link list Add link to another container
--link-local-ip list Container IPv4/IPv6 link-local addresses
--log-driver string Logging driver for the container
--log-opt list Log driver options
--mac-address string Container MAC address (e.g., 92:d0:c6:0a:29:33)
-m, --memory bytes Memory limit
--memory-reservation bytes Memory soft limit
--memory-swap bytes Swap limit equal to memory plus swap: '-1' to enable
unlimited swap
--memory-swappiness int Tune container memory swappiness (0 to 100) (default -1)
--mount mount Attach a filesystem mount to the container
--name string Assign a name to the container
--network network Connect a container to a network
--network-alias list Add network-scoped alias for the container
--no-healthcheck Disable any container-specified HEALTHCHECK
--oom-kill-disable Disable OOM Killer
--oom-score-adj int Tune host's OOM preferences (-1000 to 1000)
--pid string PID namespace to use
--pids-limit int Tune container pids limit (set -1 for unlimited)
--privileged Give extended privileges to this container
-p, --publish list Publish a container's port(s) to the host
-P, --publish-all Publish all exposed ports to random ports
--read-only Mount the container's root filesystem as read only
--restart string Restart policy to apply when a container exits (default "no")
--rm Automatically remove the container when it exits
--runtime string Runtime to use for this container
--security-opt list Security Options
--shm-size bytes Size of /dev/shm
--sig-proxy Proxy received signals to the process (default true)
--stop-signal string Signal to stop a container (default "SIGTERM")
--stop-timeout int Timeout (in seconds) to stop a container
--storage-opt list Storage driver options for the container
--sysctl map Sysctl options (default map[])
--tmpfs list Mount a tmpfs directory
-t, --tty Allocate a pseudo-TTY
--ulimit ulimit Ulimit options (default [])
-u, --user string Username or UID (format: [:])
--userns string User namespace to use
--uts string UTS namespace to use
-v, --volume list Bind mount a volume
--volume-driver string Optional volume driver for the container
--volumes-from list Mount volumes from the specified container(s)
-w, --workdir string Working directory inside the container
(3)OPTIONS说明
- --name="容器的名字":为容器指定一个名称
- -d:后台运行容器,并返回容器ID,也即启动守护式容器
- -i:以交互模式运行容器,通常与-t同时使用
- -t:为容器重新分配一个伪输入终端,通常与-i同时使用
- -P:随机端口映射
- -p:指定端口映射
- ip:hostPort:containerPort
- ip::containerPort
hostPort:containerPort
- containerPort
(4)COMMAND说明
在容器内执行命令,如:
docker run -it centos /bin/bash
3.3.2 docker ps [OPTIONS]
(1)用途
列出当前所有正在运行的容器
(2)查看帮助
[root@localhost ~]# docker --help 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
--format string Pretty-print containers using a Go template
-n, --last int Show n last created containers (includes all states) (default -1)
-l, --latest Show the latest created container (includes all states)
--no-trunc Don't truncate output
-q, --quiet Only display numeric IDs
-s, --size Display total file sizes
(3)OPTIONS说明
-a:列出当前所有
正在运行
+历史上运行过
的容器-l:显示最近创建的容器
-n:显示最近n个创建的容器
-q:静默模式,只显示容器编号
--no-trunc:不截断输出
3.3.4 退出
-
exit
停止容器并退出
-
ctrl+P+Q
容器不停止退出
3.3.5 启动容器
- docker start 容器ID或容器名
[root@localhost ~]# docker --help start
Usage: docker start [OPTIONS] CONTAINER [CONTAINER...]
Start one or more stopped containers
Options:
-a, --attach Attach STDOUT/STDERR and forward signals
--detach-keys string Override the key sequence for detaching a container
-i, --interactive Attach container's STDIN
3.3.6 重启容器
- docker restart 容器ID或容器名
[root@localhost ~]# docker --help restart
Usage: docker restart [OPTIONS] CONTAINER [CONTAINER...]
Restart one or more containers
Options:
-t, --time int Seconds to wait for stop before killing the container (default 10)
3.3.7 停止容器
- docker stop 容器ID或容器名
[root@localhost ~]# docker --help stop
Usage: docker stop [OPTIONS] CONTAINER [CONTAINER...]
Stop one or more running containers
Options:
-t, --time int Seconds to wait for stop before killing it (default 10)
3.3.8 强制停止容器
- docker kill 容器ID或容器名
[root@localhost ~]# docker --help kill
Usage: docker kill [OPTIONS] CONTAINER [CONTAINER...]
Kill one or more running containers
Options:
-s, --signal string Signal to send to the container (default "KILL")
3.3.9 删除已停止的容器
-
删除一个
docker rm 容器ID
-
删除多个
- docker rm -f $(docker ps -a -q)
- docker ps -a -q |
xargs
docker rm
[root@localhost ~]# docker --help rm
Usage: docker rm [OPTIONS] CONTAINER [CONTAINER...]
Remove one or more containers
Options:
-f, --force Force the removal of a running container (uses SIGKILL)
-l, --link Remove the specified link
-v, --volumes Remove the volumes associated with the container
3.3.10 启动守护式进程
Docker容器后台运行
(docker run -d
centos),就必须有一个前台进程。
容器运行的命令(内置的或手动调用的[COMMOND])如不是那些一直挂起的命令(比如运行top,tail),容器启动后,就会自动退出
。
最佳解决方案:将你要运行的程序,以前台进程的形式运行
。
3.3.11 查看容器日志
(1)命令
docker logs -f -t --tail 容器ID
(2)查看帮助
[root@localhost ~]# docker --help logs
Usage: docker logs [OPTIONS] CONTAINER
Fetch the logs of a container
Options:
--details Show extra details provided to logs
-f, --follow Follow log output
--since string Show logs since timestamp (e.g. 2013-01-02T13:23:37) or relative (e.g. 42m for 42 minutes)
--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:37) or relative (e.g. 42m for 42 minutes)
(3)OPTIONS说明
- -t:加入时间戳
- -f:跟随最新的日志打印
- --tail
数字
:显示最后多少条
3.3.12 查看容器内运行的进程
(1)命令
docker top 容器ID
(2)查看帮助
[root@localhost ~]# docker --help top
Usage: docker top CONTAINER [ps OPTIONS]
Display the running processes of a container
3.3.13 查看容器内部细节
(1)命令
docker inspect 容器ID
(2)实例
[root@localhost ~]# docker inspect 152ba12b05b1
[
{
"Id": "152ba12b05b14b531ce712ce15e1fd9f75bf8ea67392db39967cd9b7c937f107",
"Created": "2019-11-24T03:07:14.138317277Z",
"Path": "/bin/bash",
"Args": [],
"State": {
"Status": "running",
"Running": true,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 3847,
"ExitCode": 0,
"Error": "",
"StartedAt": "2019-11-24T03:07:14.889584292Z",
"FinishedAt": "0001-01-01T00:00:00Z"
},
......[部分代码]
3.3.14 进入正在运行的容器并以命令交互运行
3.3.14.1 exec命令
exec是在容器中打开新的终端
,并且可以启动新的进程
(1)命令模板:
docker exec -it 容器ID bashshell
(2)查看帮助
[root@localhost ~]# docker --help exec
Usage: docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
Run a command in a running container
Options:
-d, --detach Detached mode: run command in the background
--detach-keys string Override the key sequence for detaching a container
-e, --env list Set environment variables
-i, --interactive Keep STDIN open even if not attached
--privileged Give extended privileges to the command
-t, --tty Allocate a pseudo-TTY
-u, --user string Username or UID (format: [:])
-w, --workdir string Working directory inside the container
(3)实例
"容器ID"为需要加入的容器ID,"bashshell"为需要运行的命令
,如:
[root@localhost ~]# docker exec -it 152ba12b05b1 /bin/bash
[root@152ba12b05b1 /]#
上述情况,执行exit命令,运行的容器并不会终止(因为通过exec命令,新开了一个/bin/bash进程,关闭的是此次前端进程
),如下:
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
152ba12b05b1 centos:centos7.3.1611 "/bin/bash" 13 minutes ago Up 13 minutes centos-test
[root@localhost ~]# docker exec -it 152ba12b05b1 /bin/bash
[root@152ba12b05b1 /]# exit
exit
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
152ba12b05b1 centos:centos7.3.1611 "/bin/bash" 17 minutes ago Up 17 minutes centos-test
[root@localhost ~]#
3.3.14.2 attach命令
attach 直接进入容器启动命令
的终端,不会启动新的进程。此情况下,如果没有其他前端进程,执行exit将会关闭容器。
(1)命令模板
docker attach 容器ID
(2)查看帮助
[root@localhost ~]# docker --help attach
Usage: docker attach [OPTIONS] CONTAINER
Attach local standard input, output, and error streams to a running container
Options:
--detach-keys string Override the key sequence for detaching a container
--no-stdin Do not attach STDIN
--sig-proxy Proxy all received signals to the process (default true)
3.3.15 从容器拷贝文件到主机
(1)命令模板
docker cp 容器ID:容器内路径 目的主机路径
(2)查看帮助
[root@localhost ~]# docker --help 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.
Options:
-a, --archive Archive mode (copy all uid/gid information)
-L, --follow-link Always follow symbol link in SRC_PATH
3.4 常用命令总结
attach Attach to a running container # 当前 shell 下 attach 连接指定运行镜像
build Build an image from a Dockerfile # 通过 Dockerfile 定制镜像
commit Create a new image from a container changes # 提交当前容器为新的镜像
cp Copy files/folders from the containers filesystem to the host path #从容器中拷贝指定文件或者目录到宿主机中
create Create a new container # 创建一个新的容器,同 run,但不启动容器
diff Inspect changes on a container's filesystem # 查看 docker 容器变化
events Get real time events from the server # 从 docker 服务获取容器实时事件
exec Run a command in an existing container # 在已存在的容器上运行命令
export Stream the contents of a container as a tar archive # 导出容器的内容流作为一个 tar 归档文件[对应 import ]
history Show the history of an image # 展示一个镜像形成历史
images List images # 列出系统当前镜像
import Create a new filesystem image from the contents of a tarball # 从tar包中的内容创建一个新的文件系统映像[对应export]
info Display system-wide information # 显示系统相关信息
inspect Return low-level information on a container # 查看容器详细信息
kill Kill a running container # kill 指定 docker 容器
load Load an image from a tar archive # 从一个 tar 包中加载一个镜像[对应 save]
login Register or Login to the docker registry server # 注册或者登陆一个 docker 源服务器
logout Log out from a Docker registry server # 从当前 Docker registry 退出
logs Fetch the logs of a container # 输出当前容器日志信息
port Lookup the public-facing port which is NAT-ed to PRIVATE_PORT # 查看映射端口对应的容器内部源端口
pause Pause all processes within a container # 暂停容器
ps List containers # 列出容器列表
pull Pull an image or a repository from the docker registry server # 从docker镜像源服务器拉取指定镜像或者库镜像
push Push an image or a repository to the docker registry server # 推送指定镜像或者库镜像至docker源服务器
restart Restart a running container # 重启运行的容器
rm Remove one or more containers # 移除一个或者多个容器
rmi Remove one or more images # 移除一个或多个镜像[无容器使用该镜像才可删除,否则需删除相关容器才可继续或 -f 强制删除]
run Run a command in a new container # 创建一个新的容器并运行一个命令
save Save an image to a tar archive # 保存一个镜像为一个 tar 包[对应 load]
search Search for an image on the Docker Hub # 在 docker hub 中搜索镜像
start Start a stopped containers # 启动容器
stop Stop a running containers # 停止容器
tag Tag an image into a repository # 给源中镜像打标签
top Lookup the running processes of a container # 查看容器中运行的进程信息
unpause Unpause a paused container # 取消暂停容器
version Show the docker version information # 查看 docker 版本号
wait Block until a container stops, then print its exit code # 截取容器停止时的退出状态值
4. DockFile镜像
镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件
,它包含运行某个软件所需的所有软件内容,包括代码、运行时、库、环境变量和配置文件。
4.1 概念
4.1.1 UnionFS(联合文件系统)
UnionFS(联合文件系统)是一种分层
、轻量级并且高性能的文件系统,它只支持对文件系统的修改并作为一次提交来一层层叠加
,同时可以将不同目录挂载到同一个虚拟文件系统下
。
Union文件系统是Docker镜像的基础。镜像可以通过分层来进行继承
,基于基础镜像(基础镜像没有父镜像),可以制作各种具体的应用镜像。
特性:一次同时加载多个文件系统, 但从外面看起来,智能看到一个文件系统,联合文件系统会把各层文件系统叠加起来,这样最终的文件系统会包含所有的文件和目录。
4.1.2 Docker镜像加载原理
docker的镜像实际是由一层层的文件系统组成,这种层级的文件系统UnionFS包括两层,底层是bootfs,bootfs之上是rootfs。
(1)bootfs
bootfs(boot file system)主要包含bootload
和kernel(linux内核基础)
,bootloader主要引导加载kernel,linux刚启动时会加载bootfs文件系统,在Docker镜像的最底层是bootfs
。
这一层与我们典型的Linux/Unix系统是一样的,包含boot加载器和内核。当boot加载完成后整个内核就都在内存中了,此时内存的使用权已有bootfs转交给内核,此时系统也会卸载bootfs。
(2)rootfs
rootfs(root file system),在bootfs之上。包含的就是典型的Linux系统中的/dev,/proc、/bin、/etc等标准目录和文件。rootfs就是各种不同的操作系统的发行版,比如Unbutu,Centos等。
(3)Docker镜像大小的问题
为什么Docker中的Conts系统只有200MB??
对于一个精简的OS,rootfs可以很小,只需要包含最基本的命令、工具和程序库就可以,因为底层直接使用Host的kernel,自己只需要提供rootfs
就行了。
因此可见对于不同的
linux发行版,bootfs基本是一致的,rootfs会有差别,因此不同的发行版可以共用bootfs
。
4.1.3 分层的镜像
下载镜像时(pull),根据输出的日志,可以看到下载的镜像,是在下载一层层的镜像。一层层的镜像叠加后,得到我们需要的目标镜像。
如镜像下载过程如下:
[root@localhost ~]# docker pull tomcat:8.5.49-jdk8
8.5.49-jdk8: Pulling from library/tomcat
844c33c7e6ea: Pull complete
ada5d61ae65d: Pull complete
f8427fdf4292: Pull complete
f025bafc4ab8: Pull complete
67b8714e1225: Extracting [> ] 65.54kB/4.935MB
64b12da521a3: Download complete
2e38df533772: Downloading [==========================> ] 55.1MB/104.2MB
4144d55bbb47: Download complete
a767078bbe38: Download complete
81f4cc5808bc: Download complete
4.1.4 为什么镜像要分层
好处:共享资源
比如:有多个镜像都是从相等base镜像构建而来, 那么宿主机只需要在磁盘上保存一份base镜像
,同时内存中也只需加载一份base镜像
,就可也为所有容器服务了。而且镜像的每一层都可以被共享。
4.2 特点
Docker镜像都是只读的。
当容器启动时,一个新的可写层被加载到镜像的顶部
。这一层通常被称作“容器层
”,“容器层”之下的都叫做“镜像层”。
4.3 Docker镜像commit操作补充
4.3.1 命令
docker commit提交容器副本使之成为一个新的镜像
docker commit -m=“提交的描述信息” -a=“作者” 容器ID 要创建的目标镜像名:[标签名]
4.3.2 帮助文档
[root@localhost ~]# docker --help commit
Usage: docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
Create a new image from a container's changes
Options:
-a, --author string Author (e.g., "John Hannibal Smith ")
-c, --change list Apply Dockerfile instruction to the created image
-m, --message string Commit message
-p, --pause Pause container during commit (default true)
4.3.2 案例
(1)hub上下载tomcat镜像并本地运行
docker run -it -p 8080:8080 tomcat:8.5.49-jdk8
(2)删除对应容器的doc目录
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f29fdd5788a9 tomcat:8.5.49-jdk8 "catalina.sh run" 7 minutes ago Up 7 minutes 0.0.0.0:8080->8080/tcp cocky_meitner
[root@localhost ~]# docker exec -it f29fdd5788a9 /bin/bash
root@f29fdd5788a9:/usr/local/tomcat# rm -rf webapps/docs/
此时访问tomcat中自带的docs将返回404错误
(3)提交一个不带docs目录的tomcat镜像
[root@localhost ~]# docker commit -a="yjpdd" -m="delete tomcat docs" f29fdd5788a9 yjpdd/tomcat:1.0
sha256:e72d43ad224a308609e6e40eccc98e19785f179a8448420a8f83ce381246a4d9
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
yjpdd/tomcat 1.0 e72d43ad224a 6 seconds ago 507MB
tomcat 8.5.49-jdk8 6408fdc94212 15 hours ago 507MB
centos centos7.3.1611 c5d48e81b986 8 months ago 192MB
[root@localhost ~]#
(4)启动新提交的镜像,新创建的容器没有docs目录
docker run --name mytomcat -it -p 7070:8080 yjpdd/tomcat:1.0
5. 容器数据卷
5.1 概念
类似redis的本地存储文件rdb和afo。
docker的理念:
将运用与运行的环境打包成容器运行,运行可以伴随着容器,但是我们
对数据的要求是持久化的
。容器之间
希望有可能共享数据
Docker容器产生的数据,如果不通过docker commit生成新的镜像,使得数据成为镜像的一部分保存下来,那么当容器删除后,数据自然也就没有了。
为了能保存数据在docker中,我们使用卷。
5.2 用处
(1)容器的持久化
(2)容器间继承+共享数据
卷就是目录或文件,存在于一个或多个容器中
,由docker挂载到容器
,但不属于联合文件系统,因此能够绕过Union File System,提供一些用于持续存储或共享数据的特性
。
卷的设计目的就是数据的持久化
,完全独立于容器的声明周期,因此Docker不会在容器删除时,删除其挂载的数据卷。
特点:
(1)数据卷可在容器之间
共享或重用数据
(2)卷中的更改可以直接生效
(3)数据卷中的更改不会包含在镜像的更新中
(4)数据卷的生命周期一直持续到没有容器使用它为止
5.2 数据卷
5.2.1 直接命令添加
(1)命令
docker run -it -v /宿主机绝对路径目录:/容器内目录 镜像名
(2)举例
- 创建映射路径的容器:
docker run --name mycentos -it -v /myDir:/myDirContent centos:centos7.3.1611
- 查看数据卷是否挂载成功
[root@localhost myDir]# docker inspect d9b14a0ee45a
#输出内容包含
"Mounts": [
{
"Type": "bind",
"Source": "/myDir",
"Destination": "/myDirContent",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
}
]
- 校验同步性
- 测试宿主机或容器更路径内容后,是否生效
- 测试容器关闭后,更改宿主机内容,重启容器后是否生效
5.2.2 docker File添加
可在Dockerfile中使用VOLUME指令
来给镜像添加一个或多个数据卷,如:
VOLUME["/dataVolumeContainer","/dataVolumeContainer2","/dataVolumeContainer3"]
说明:
出于可移植和分享
的考虑,用-v 主机目录:容器目录这种方法不能够直接在Dockerfile中实现
。
由于宿主机目录是依赖于特定宿主机的,并不能够保证在所有的宿主机上都存在这样的特定目录
举例:
(1)根目录下创建“mydocker”文件夹并进入
[root@localhost /]# mkdir /mydocker
[root@localhost /]# cd /mydocker/
(2)创建docker File文件“dockerFile”
[root@localhost mydocker]# cat dockerFile
# volume test
FROM centos
VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]
CMD echo "finished,--------success1"
CMD /bin/bash
(3)build后生成新镜像“yjpdd/centos”
[root@localhost mydocker]# docker build -f /mydocker/dockerFile -t yjpdd/centos .
Sending build context to Docker daemon 2.048kB
Step 1/4 : FROM centos
latest: Pulling from library/centos
729ec3a6ada3: Pull complete
Digest: sha256:f94c1d992c193b3dc09e297ffd54d8a4f1dc946c37cbeceb26d35ce1647f88d9
Status: Downloaded newer image for centos:latest
---> 0f3e07c0138f
Step 2/4 : VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]
---> Running in d37229cd91d5
Removing intermediate container d37229cd91d5
---> 83971c7d3784
Step 3/4 : CMD echo "finished,--------success1"
---> Running in e08b3b15cc1a
Removing intermediate container e08b3b15cc1a
---> 917ce7ba5394
Step 4/4 : CMD /bin/bash
---> Running in a275bc9ab6b6
Removing intermediate container a275bc9ab6b6
---> a50252d5ef01
Successfully built a50252d5ef01
Successfully tagged yjpdd/centos:latest
(4)启动容器
发现文件目录(dataVolumeContainer1、dataVolumeContainer2)已创建好
[root@localhost mydocker]# docker run -it yjpdd/centos /bin/bash
[root@d97082e09e53 /]# ls
bin dataVolumeContainer1 dataVolumeContainer2 dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
(5)查看宿主机中对应的文件目录地址
#执行命令
[root@localhost mydocker]# docker inspect d97082e09e53
#查看文件内容
"Mounts": [
{
"Type": "volume",
"Name": "27d1c32b132d20cbfcecb69b69a99943c172459344c796e8bf9314741cb1559f",
"Source": "/var/lib/docker/volumes/27d1c32b132d20cbfcecb69b69a99943c172459344c796e8bf9314741cb1559f/_data",
"Destination": "/dataVolumeContainer1",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
},
{
"Type": "volume",
"Name": "94a8d4ca7202112a17cc7422fcf84636c5b3f10f110b3094db8cf22ce29fe7ae",
"Source": "/var/lib/docker/volumes/94a8d4ca7202112a17cc7422fcf84636c5b3f10f110b3094db8cf22ce29fe7ae/_data",
"Destination": "/dataVolumeContainer2",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
]
5.2.3 补充
Docker挂载主机目录Docker访问出现cannot open directory .: Permission denied
解决办法:在挂载目录后多加一个--privileged=true
参数
5.3 数据卷容器
5.3.1 概念
关键字:--volumes-from
命名的容器挂载数据卷,其他容易通过挂载这个(父容器)
实现数据共享,挂载数据卷的容器,称之为数据卷容器。
容器之间的配置信息传递,数据卷的生命周期一致持续到没有容器使用它位置。
5.3.2 案例
(1)根据5.2.2中根据Docker File创建的容器卷创建三个容器
创建容器dc01,dc02,dc03
#创建父容器
docker run --name dc01 -it yjpdd/centos
#创建子容器
docker run --name dc02 -it --volumes-from dc01 yjpdd/centos
#创建子容器
docker run --name dc03 -it --volumes-from dc01 yjpdd/centos
(2)校验文件的一致性
经测试,删除被依赖的父类,容器共享仍然有效。
故容器之间的配置信息传递,数据卷的生命周期一致持续到没有容器使用它位置。
6. DockerFile解析
6.1 概念
DockerFile是用来构建Docker镜像的构建文件
,是由一系列命令和参数构成的脚本
。
构建步骤:
(1)编写DockerFile文件
(2)docker build
(3)docker run
文件示例:
FROM scratch
MAINTAINER https://github.com/CentOS/sig-cloud-instance-images
ADD centos-7-docker.tar.xz /
LABEL name="CentOS Base Image" \
vendor="CentOS" \
license="GPLv2" \
build-date="20161214"
CMD ["/bin/bash"]
6.2 DockerFile构建过程解析
6.2.1 DockerFile基础知识
(1)每条保留字指令都必须大写字母
,且后面要跟随至少一个参数
。
(2)指令按照从上到下,顺序执行
(3)#
表示注释
(4)每条指令都会创建一个新的镜像层,并对镜像进行提交
6.2.2 Docker执行DockerFile的大致流程
(1)docker从基础镜像
运行一个容器
(2)执行一条指令并对容器做出修改
(3)执行类似docker commit的操作提交一个新的镜像层
(4)docker再基于刚提交的镜像运行一个新容器
(5)执行DockerFile中的下一条执行知道所有指令都执行完成
说明:
DockerFile中的每一条执行,都会先根据上一部的镜像(开始的时候是基础镜像)产生一个新容器,A
然后根据指令更改容器后,提交一个新的镜像,再根据新的镜像运行一个新的容器,继续A
,执行下一个指令。
符合6.2.1(4)中提到的“每条执行都会创建一个新的镜像层,并对镜像进行提交”
基于原理:
镜像是只读的,不可以更改
容器是可以更改的
容器可以提交成镜像(commit)
6.2.3 小总结
从应用软件的角度来看,DockerFile、Docker镜像与Docker容器分别代码软件的三个不同阶段。
- DockerFile是软件的原材料
- Docker镜像是软件的交付品
- Docker容器则可以认为是软件的运行状态
DockerFile面向开发,Docker镜像成为交付标准,Docker容器则涉及部署与运维,三者缺一不可,合力充当Docker体系的基石。
(1)DockerFile。需要定义一个DockerFile,DockerFile定义了进程需要的一切东西。DockerFile涉及的内容包括执行代码或者是文件、环境变量、依赖包、运行时环境、动态链接库、操作系统的发行版、服务进程和内核进程(当应用进程需要和系统服务和内核进程打交道,这是需要考虑如何设计namespace的控制权限)等等。
(2)Docker镜像,在用DockerFile定义一个文件后,docker build时会产生一个docker镜像,当运行Docker镜像时,会真正开始提供服务
(3)Docker容器,容器是直接提供服务的
6.3 DockerFile体系结构(保留字指令)
FROM:
基础镜像
。当前镜像时基于哪个镜像的MAINTAINER:镜像维护者的姓名和邮箱地址
RUN:容器构建时
需要运行的命令
EXPOSE:当前容器对外暴露的
端口
WORKDIR:指定在创建容器后,终端
默认登录进来的工作目录
,一个落脚点ENV:用来在构建镜像过程中设置
环境变量
ADD:将
宿主机目录下的文件拷贝进镜像
,且ADD命令会自动处理URL和解压tar压缩包
COPY:类似ADD,
拷贝文件和目录到镜像中
。将从构建上下文目录中<源路径>的文件/目录,复制到新的一层的镜像内的<目标路径>位置。VOLUME:
容器数据卷
,用于数据保存和持久化工作CMD:指定一个容器启动时要运行的命令,DockerFile中可以有多个CMD指令,但
只有最后一个生效
,CMD会被docker run之后的参数替换
CMD指令的格式和RUN相似:
- shell格式:CMD <命令>
- exec格式:CMD ["可执行文件","参数1","参数2"...]
- 参数列表格式:CMD["参数1","参数2"...]。在指定了
ENTRYPOINT
指令后,用CMD指定具体的参数
- ENTRYPOINT:指定一个容器启动时要运行的命令。ENTRYPOINT的目的和CMD一样,都是在指定容器启动的程序及参数
- ONBUILD:当前构建一个被继承的DockerFile是运行命令,父进项在被子类继承后,父镜像的ONBUILD被触发
6.3 案例
6.3.1 Base镜像(scratch)
Docker Hub中99%的镜像都是通过在base镜像中安装和配置需要的软件构建出来的。
FROM scratch
6.3.2 自定义Centos
完成功能:
(1) 更改/user/local为登录路径(默认路径是/)
(2)支持vim编辑器(默认不支持)
(3)支持查看网络配置ifconfig(默认不支持)
步骤:
(1)创建dockerFile文件
[root@localhost mydockerfile]# pwd
/mydockerfile
[root@localhost mydockerfile]# vim dockerfile
(2)编写dockerFile文件
#基础镜像
FROM centos
#创建人信息
MAINTAINER pdd
#定义变量
ENV MYPATH /user/local
#设置默认登录目录
WORKDIR $MYPATH
#运行命令
RUN yum -y install vim
RUN yum -y install net-tools
#对外暴露端口
EXPOSE 80
#指定容器启动时运行的命令(只有最后一个会生效,会被Run之后的命令替换)
CMD echo $MYPATH
CMD echo "success ----------ok"
CMD /bin/bash
(3)构建镜像
".
":代表当前路径
docker build -t mycentos:1.0 .
执行过程如下(共10步,对应dockerFile中的10条指令):
[root@localhost mydockerfile]# ls
dockerfile
[root@localhost mydockerfile]# docker build -t mycentos:1.0 .
Sending build context to Docker daemon 2.048kB
Step 1/10 : FROM centos
latest: Pulling from library/centos
Digest: sha256:f94c1d992c193b3dc09e297ffd54d8a4f1dc946c37cbeceb26d35ce1647f88d9
Status: Downloaded newer image for centos:latest
---> 0f3e07c0138f
Step 2/10 : MAINTAINER pdd
---> Running in 3242d8cc4816
Removing intermediate container 3242d8cc4816
---> 8140a41ea673
Step 3/10 : ENV MYPATH /user/local
---> Running in 61e5f240a5b6
Removing intermediate container 61e5f240a5b6
---> 5d4c35e13916
Step 4/10 : WORKDIR $MYPATH
---> Running in 4310d8bd9f26
Removing intermediate container 4310d8bd9f26
---> 8ebeb43f3636
Step 5/10 : RUN yum -y install vim
---> Running in 6dfadcf048b0
CentOS-8 - AppStream 1.3 MB/s | 6.3 MB 00:04
CentOS-8 - Base 965 kB/s | 7.9 MB 00:08
CentOS-8 - Extras 604 B/s | 2.1 kB 00:03
Dependencies resolved.
================================================================================
Package Arch Version Repository Size
================================================================================
Installing:
vim-enhanced x86_64 2:8.0.1763-10.el8 AppStream 1.4 M
Installing dependencies:
gpm-libs x86_64 1.20.7-15.el8 AppStream 39 k
vim-common x86_64 2:8.0.1763-10.el8 AppStream 6.3 M
vim-filesystem noarch 2:8.0.1763-10.el8 AppStream 48 k
which x86_64 2.21-10.el8 BaseOS 49 k
Transaction Summary
================================================================================
Install 5 Packages
Total download size: 7.8 M
Installed size: 30 M
Downloading Packages:
(1/5): gpm-libs-1.20.7-15.el8.x86_64.rpm 35 kB/s | 39 kB 00:01
(2/5): vim-filesystem-8.0.1763-10.el8.noarch.rp 690 kB/s | 48 kB 00:00
(3/5): which-2.21-10.el8.x86_64.rpm 180 kB/s | 49 kB 00:00
(4/5): vim-enhanced-8.0.1763-10.el8.x86_64.rpm 887 kB/s | 1.4 MB 00:01
(5/5): vim-common-8.0.1763-10.el8.x86_64.rpm 2.4 MB/s | 6.3 MB 00:02
--------------------------------------------------------------------------------
Total 1.4 MB/s | 7.8 MB 00:05
warning: /var/cache/dnf/AppStream-02e86d1c976ab532/packages/gpm-libs-1.20.7-15.el8.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID 8483c65d: NOKEY
CentOS-8 - AppStream 14 kB/s | 1.6 kB 00:00
Importing GPG key 0x8483C65D:
Userid : "CentOS (CentOS Official Signing Key) "
Fingerprint: 99DB 70FA E1D7 CE22 7FB6 4882 05B5 55B3 8483 C65D
From : /etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial
Key imported successfully
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
Preparing : 1/1
Installing : which-2.21-10.el8.x86_64 1/5
Installing : vim-filesystem-2:8.0.1763-10.el8.noarch 2/5
Installing : vim-common-2:8.0.1763-10.el8.x86_64 3/5
Installing : gpm-libs-1.20.7-15.el8.x86_64 4/5
Running scriptlet: gpm-libs-1.20.7-15.el8.x86_64 4/5
Installing : vim-enhanced-2:8.0.1763-10.el8.x86_64 5/5
Running scriptlet: vim-enhanced-2:8.0.1763-10.el8.x86_64 5/5
Running scriptlet: vim-common-2:8.0.1763-10.el8.x86_64 5/5
Verifying : gpm-libs-1.20.7-15.el8.x86_64 1/5
Verifying : vim-common-2:8.0.1763-10.el8.x86_64 2/5
Verifying : vim-enhanced-2:8.0.1763-10.el8.x86_64 3/5
Verifying : vim-filesystem-2:8.0.1763-10.el8.noarch 4/5
Verifying : which-2.21-10.el8.x86_64 5/5
Installed:
vim-enhanced-2:8.0.1763-10.el8.x86_64 gpm-libs-1.20.7-15.el8.x86_64
vim-common-2:8.0.1763-10.el8.x86_64 vim-filesystem-2:8.0.1763-10.el8.noarch
which-2.21-10.el8.x86_64
Complete!
Removing intermediate container 6dfadcf048b0
---> e8a11e706535
Step 6/10 : RUN yum -y install net-tools
---> Running in f221b0caea50
error: rpmdb: damaged header #175 retrieved -- skipping.
error: rpmdb: damaged header #175 retrieved -- skipping.
error: rpmdbNextIterator: skipping h# 175 blob size(13252): BAD, 8 + 16 * il(71) + dl(12108)
Last metadata expiration check: 0:00:14 ago on Mon Nov 25 11:18:42 2019.
Dependencies resolved.
================================================================================
Package Arch Version Repository Size
================================================================================
Installing:
net-tools x86_64 2.0-0.51.20160912git.el8 BaseOS 323 k
Transaction Summary
================================================================================
Install 1 Package
Total download size: 323 k
Installed size: 1.0 M
Downloading Packages:
net-tools-2.0-0.51.20160912git.el8.x86_64.rpm 255 kB/s | 323 kB 00:01
--------------------------------------------------------------------------------
Total 49 kB/s | 323 kB 00:06
CentOS-8 - Base 1.6 MB/s | 1.6 kB 00:00
error: rpmdbNextIterator: skipping h# 175 blob size(13252): BAD, 8 + 16 * il(71) + dl(12108)
warning: /var/cache/dnf/BaseOS-f6a80ba95cf937f2/packages/net-tools-2.0-0.51.20160912git.el8.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID 8483c65d: NOKEY
error: rpmdbNextIterator: skipping h# 175 blob size(13252): BAD, 8 + 16 * il(71) + dl(12108)
error: rpmdbNextIterator: skipping h# 175 blob size(13252): BAD, 8 + 16 * il(71) + dl(12108)
Importing GPG key 0x8483C65D:
Userid : "CentOS (CentOS Official Signing Key) "
Fingerprint: 99DB 70FA E1D7 CE22 7FB6 4882 05B5 55B3 8483 C65D
From : /etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial
error: rpmdbNextIterator: skipping h# 175 blob size(13252): BAD, 8 + 16 * il(71) + dl(12108)
Key imported successfully
error: rpmdbNextIterator: skipping h# 175 blob size(13252): BAD, 8 + 16 * il(71) + dl(12108)
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
Preparing : 1/1
Installing : net-tools-2.0-0.51.20160912git.el8.x86_64 1/1
Running scriptlet: net-tools-2.0-0.51.20160912git.el8.x86_64 1/1
Verifying : net-tools-2.0-0.51.20160912git.el8.x86_64 1/1
Installed:
net-tools-2.0-0.51.20160912git.el8.x86_64
Complete!
Removing intermediate container f221b0caea50
---> 1592e3613d33
Step 7/10 : EXPOSE 80
---> Running in a8047a6b1c9a
Removing intermediate container a8047a6b1c9a
---> 0d3474d470f1
Step 8/10 : CMD echo $MYPATH
---> Running in c4010e82a252
Removing intermediate container c4010e82a252
---> 6c53476cffca
Step 9/10 : CMD echo "success ----------ok"
---> Running in 67c9daf4a174
Removing intermediate container 67c9daf4a174
---> be8ef19afb82
Step 10/10 : CMD /bin/bash
---> Running in 79dea2932d5b
Removing intermediate container 79dea2932d5b
---> eeb3c1346c88
Successfully built eeb3c1346c88
Successfully tagged mycentos:1.0
[root@localhost mydockerfile]#
(4)运行
[root@localhost mydockerfile]# docker run -it mycentos:1.0
[root@50ab13983dce local]# pwd
/user/local
[root@50ab13983dce local]# vim 1.log
[root@50ab13983dce local]# ls
1.log
[root@50ab13983dce local]# ifconfig
eth0: flags=4163 mtu 1500
inet 172.17.0.2 netmask 255.255.0.0 broadcast 172.17.255.255
ether 02:42:ac:11:00:02 txqueuelen 0 (Ethernet)
RX packets 8 bytes 648 (648.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73 mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
loop txqueuelen 1 (Local Loopback)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
[root@50ab13983dce local]#
(5)查看镜像变更历史
[root@localhost mydockerfile]# docker history mycentos:1.0
IMAGE CREATED CREATED BY SIZE COMMENT
eeb3c1346c88 8 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "/bin… 0B
be8ef19afb82 8 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "echo… 0B
6c53476cffca 8 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "echo… 0B
0d3474d470f1 8 minutes ago /bin/sh -c #(nop) EXPOSE 80 0B
1592e3613d33 8 minutes ago /bin/sh -c yum -y install net-tools 14.3MB
e8a11e706535 8 minutes ago /bin/sh -c yum -y install vim 66.8MB
8ebeb43f3636 9 minutes ago /bin/sh -c #(nop) WORKDIR /user/local 0B
5d4c35e13916 9 minutes ago /bin/sh -c #(nop) ENV MYPATH=/user/local 0B
8140a41ea673 9 minutes ago /bin/sh -c #(nop) MAINTAINER pdd 0B
0f3e07c0138f 7 weeks ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B
7 weeks ago /bin/sh -c #(nop) LABEL org.label-schema.sc… 0B
7 weeks ago /bin/sh -c #(nop) ADD file:d6fdacc1972df524a… 220MB
完整信息可通过以下命令查看:
docker history mycentos:1.0 --no-trunc
6.3.3 自定义Tomcat
7. Docker常用安装
测试步骤
- 搜索镜像
- 拉取镜像
- 查看镜像
- 启动镜像
- 停止容器
- 移除容器
7.1 安装mysql
(1)下载镜像
docker pull mysql:5.6
(2)创建并生成容器
docker run -p 1234:3306 --name mysqlSimple -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.6
(3)创建并生成容器(挂载外部资源)
docker run -p 1111:3306 --name mysqlTrans -e MYSQL_ROOT_PASSWORD=123456 -d -v /mydocker/mysqlData/data:/var/lib/mysql -v /mydocker/mysqlData/config:/etc/mysql/conf.d mysql:5.6
7.2 安装redis
(1)下载镜像
(2)创建并生成容器
8. Docker开启远程访问
8.1 修改配置文件
vi /usr/lib/systemd/system/docker.service
文件中[Service]
中更改ExecStart
以下内容:
更改前:
[Service]
Type=notify
# the default is not to use systemd for cgroups because the delegate issues still
# exists and systemd currently does not support the cgroup feature set required
# for containers run by docker
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
更改后:
[Service]
Type=notify
# the default is not to use systemd for cgroups because the delegate issues still
# exists and systemd currently does not support the cgroup feature set required
# for containers run by docker
#ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
ExecStart=
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock
8.2 刷新配置,重启Docker
systemctl daemon-reload
systemctl restart docker
8.3 查看docker进程是否监听
[root@localhost ~]# netstat -ano | grep 2375
tcp6 0 0 :::2375 :::* LISTEN off (0.00/0/0)
8.4 查看系统网络端口2375是否被docker所监听
[root@localhost ~]# netstat -tulp | grep 2375
tcp6 0 0 [::]:2375 [::]:* LISTEN 8056/dockerd
9. Centos7关闭防火墙
9.1 查看防火墙状态
firewall-cmd --state
9.2 关闭防火墙服务
systemctl stop firewalld.service
9.3 禁止防火墙开机启动
systemctl disable firewalld.service