赞
踩
Docker中文文档
推荐
Docker Documents
推荐,原汁原味,更直接
Job for docker.service failed because the control process exited with error code. See
vim /etc/docker/daemon.json
书写不规范,会导致这个错误
使用docker run后状态为Exited (1)
配置文件编写有问题也会导致这个问题,大概来将容器内mysql运行失败都会导致容器进入这个状态
Docker之Mysql数据持久化
https://blog.csdn.net/qq_31864653/article/details/90769142
“exec: “docker-entrypoint.sh”: executable file not found in $PATH”.解决方法
Docker可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化。
Docker 项目的目标是实现轻量级的操作系统虚拟化解决方案。 Docker 的基础是 Linux 容器(LXC)等技术。
在 LXC 的基础上 Docker 进行了进一步的封装,让用户不需要去关心容器的管理,使得操作更为简便。用户操作 Docker 的容器就像操作一个快速轻量级的虚拟机一样简单。
1.Web应用的自动化打包和发布
2.自动化测试和持续集成、发布
3.在服务型环境中部署和调整数据库或其它的后台应用。
4.从头编译或者扩展现有的OpenShift或Cloud Foundry平台来搭建自己的PaaS环境。
1.快速、一致的交付应用程序
2.在任何地方开发、部署和运行任何应用
Docker是一款针对程序开发人员和系统管理员来开发、部署、运行应用的一款虚拟化平台。Docker 可以让你像使用集装箱一样快速的组合成应用,并且可以像运输标准集装箱一样,尽可能的屏蔽代码层面的差异。Docker 会尽可能的缩短从代码测试到产品部署的时间。
3.在同一硬件上运行更多工作负载
[翻译]传统虚拟机包含:应用、二进制文件/库和客体操作系统三部分。每一个被虚拟化的应用可能只有几或几十MB,同时需要一些二进制文件和库。但是一个被虚拟化的操作系统却可能需要几十GB。
多个虚拟机之间需要有多个guest os,guest os占用大量的空间。
[翻译]这个Docker 引擎上的容器仅包含应用和一些其它的依赖文件。Docker 引擎作为一个独立进程在主机操作系统的用户空间(userspace)内运行。每一个容器都可以共享这个Docker 引擎。因此,Docker在具备传统虚拟机资源隔离和资源分配优势的基础上,拥有更高的效率和更好的可移植性。
1.关于hypervisor:虚拟机监视器,是用来建立与执行虚拟机器的软件、固件或硬件。被Hypervisor用来执行一个或多个虚拟机器的电脑称为主体机器(host machine),这些虚拟机器则称为客体机器(guest machine)。hypervisor提供虚拟的作业平台来执行客体操作系统(guest operating systems),负责管理其他客体操作系统的执行阶段;这些客体操作系统,共同分享虚拟化后的硬件资源。
2.Guest OS:运行在Guest Machine上的操作系统
3.Docker Engine 是一个基于虚拟化技术的轻量级并且功能强大的开源容器引擎管理工具。它可以将不同的 work flow 组合起来构建成你的应用。
4.Docker Hub 可以分享和管理你的images镜像的一个 Saas 服务。
三个基本概念:镜像(Mirroring)、容器(Container)、仓库(Repository)
Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器。
镜像(Mirroring):一种文件存储形式,是冗余的一种类型,一个磁盘上的数据在另一个磁盘上存在一个完全相同的副本即为镜像。举例:多个文件的集合 θ { A 1 , A 2 , . . . , A n } \theta\{A_1,A_2,...,A_n\} θ{A1,A2,...,An}打包成镜像文件,镜像文件展开后恢复成多个文件的集合 θ \theta θ,前后数据内容完全一致。
容器(Container):容器是镜像的实例
仓库(Repository):可以看成一个代码控制中心,用于保存镜像
关键名词
名词 | 说明 |
---|---|
Docker镜像 | Docker 镜像是用于创建 Docker 容器的模板 |
Docker 容器 | 容器是独立运行的一个或一组应用,是镜像运行时的实体。 |
Docker 客户端 | Docker 客户端通过命令行或者其他工具使用 Docker SDK (https://docs.docker.com/develop/sdk/) 与 Docker 的守护进程通信。 |
Docker 主机(Host) | 一个物理或者虚拟的机器用于执行 Docker 守护进程和容器。 |
Docker Registry | Docker 仓库用来保存镜像,可以理解为代码控制中的代码仓库。Docker Hub(https://hub.docker.com) 提供了庞大的镜像集合供使用。一个 Docker Registry 中可以包含多个仓库(Repository);每个仓库可以包含多个标签(Tag);每个标签对应一个镜像。通常,一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本。我们可以通过 <仓库名>:<标签> 的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以 latest 作为默认标签。 |
Docker Machine | Docker Machine是一个简化Docker安装的命令行工具,通过一个简单的命令行即可在相应的平台上安装Docker,比如VirtualBox、 Digital Ocean、Microsoft Azure。 |
在Docker中,一个只读层被称为镜像。
Docker使用一个统一的文件系统,Docker进程认为整个文件系统是以读写方式挂载的。但是所有的变更都发生在顶层的可写层,而下层的原始的只读镜像文件并未发生变化。
Docker镜像是多层存储结构,镜像中的每一层都是可继承、可复用的。
父镜像
每一个镜像都可能依赖于由一个或多个下层的组成的另一个镜像。通常将下层的那个镜像成为上层镜像的父镜像。
基础镜像
无父镜像的镜像被成为基础镜像。
镜像ID
所有镜像都是通过一个 64 位十六进制字符串 (内部是一个 256 bit 的值)来标识的。 为简化使用,前 12 个字符可以组成一个短ID,可以在命令行中使用。短ID还是有一定的 碰撞机率,所以服务器总是返回长ID。
获取镜像,使用docker pull <镜像名称:镜像标签>
命令从仓库中获取需要的镜像。
下载过程中会输出获取镜像每一层的信息
sudo docker pull ubuntu:20.10
20.10: Pulling from library/ubuntu
0b4f5d796ad9: Pull complete
59ee7132703b: Pull complete
672e5b34dda8: Pull complete
d3af786f5e76: Pull complete
Digest: sha256:8b55362d424379a123758b70ddc2c5d3fbc3b5815d110be2a43933fa385672a3
Status: Downloaded newer image for ubuntu:20.10
docker.io/library/ubuntu:20.10
若默认的官方仓库下载速度过慢,可以使用
docker pull <域名:端口号>/<镜像名称:镜像标签>
指定从某个仓库下载镜像
也可以设置加速源或国内源,方法写在下面,可以参照
docker images
显示本地已有的镜像REPOSITORY 仓库名称
TAG 镜像标签
IMAGE ID 镜像ID
CREATED 创建时间
VIRTUAL SIZE 镜像大小
镜像ID唯一标识了镜像
TAG信息用来标记同一个仓库的不同镜像
Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明,一些元数据(metadata)还包含以该镜像为基础运行的容器的行为。
一般的,Dockerfile 分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令。
基本语法:
使用#
来注释
FROM
指令告诉 Docker 使用哪个镜像作为基础
接着是维护者的信息
RUN
开头的指令会在创建中运行,比如安装一个软件包。
FORM
指令
指出使用的模板镜像,定制镜像都是在模板镜像的基础上进行。
RUN
指令
用于执行后面跟着的命令行命令,有以下两种格式:
RUN <命令行命令>
# <命令行命令> 等同于,在终端操作的 shell 命令。
RUN ["可执行文件", "参数1", "参数2"]
# 例如:
# RUN ["./test.php", "dev", "offline"] 等价于 RUN ./test.php dev offline
Dockerfile中每一条指令都创建镜像的一层。所以过多无意义的层会导致镜像膨胀过大。一个镜像不能超过127层,镜像层属性为只读,但镜像实例化为容器时该层可读可写。
解析:由于 docker 的运行模式是 C/S。我们本机是 C,docker 引擎是 S。实际的构建过程是在 docker 引擎下完成的,所以这个时候无法用到我们本机的文件。这就需要把我们本机的指定目录下的文件一起打包提供给 docker 引擎使用。
如果未说明最后一个参数,那么默认上下文路径就是 Dockerfile 所在的位置。
-t
标记用来添加标签 <镜像名称:镜像标签>
docker tag
用于修改镜像标签
docker images
列出本地镜像
docker push
上传镜像到仓库中
docker save
导出镜像文件到本地
docker load
载入镜像
vim /home/tu/dockertags.sh
将以下内容放在dockertags.sh
文件中
#!/bin/bash function usage() { cat << HELP dockertags -- list all tags for a Docker image on a remote registry. EXAMPLE: - list all tags for ubuntu: dockertags ubuntu - list all php tags containing apache: dockertags php apache HELP } if [ $# -lt 1 ]; then usage exit fi image="$1" tags=`wget -q https://registry.hub.docker.com/v1/repositories/${image}/tags -O - | sed -e 's/[][]//g' -e 's/"//g' -e 's/ //g' | tr '}' '\n' | awk -F: '{print $3}'` if [ -n "$2" ]; then tags=` echo "${tags}" | grep "$2" ` fi echo "${tags}"
修改权限,运行脚本,得到输出
chmod 755 dockertags.sh ./dockertags.sh ubuntu latest 10.04 12.04 12.04.5 12.10 13.04 13.10 14.04 14.04.1 14.04.2 14.04.3 14.04.4 14.04.5 14.10 15.04 15.10 16.04 16.10 17.04 17.10 18.04 18.10 19.04 19.10 20.04 20.10 artful artful-20170511.1 ... artful-20180706 bionic bionic-20171114 ... bionic-20200526 cosmic cosmic-20180605 ... cosmic-20190719 devel disco disco-20181112 ... disco-20200114 eoan eoan-20190508 ... eoan-20200608 focal focal-20191030 ... focal-20200606 groovy groovy-20200505 groovy-20200609 lucid precise precise-20150212 ... precise-20170331 quantal raring rolling saucy trusty trusty-20150218.1 ...
vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://7bezldxe.mirror.aliyuncs.com/","https://docker.mirrors.ustc.edu.cn/","https://hub-mirror.c.163.com","https://registry.docker-cn.com"]
}
加载配置文件
重启docker
systemctl daemon-reload
systemctl restart docker
容器是镜像的的行为
启动容器
两种情形:一种是基于镜像新建一个容器并启动;
另外一种是将处于终止状态(stopped)的容器重新启动。
新建并启动
docker run
示例1:使用ubuntu:14.04
镜像生成一个容器,在容器中执行/bin/echo 'Hello world'
sudo docker run ubuntu:14.04 /bin/echo 'Hello world'
Hello world
示例2:使用ubuntu:14.04
镜像生成一个容器,在容器中执行/bin/bash
,该命令会开启一个bash终端
sudo docker run -t -i ubuntu:14.04 /bin/bash
root@af8bae53bdd3:/#
其中,-t
选项让Docker分配一个伪终端(pseudo-tty)并绑定到容器的标准输入上, -i
则让容器的标准输入保持打开。
利用 docker run
来创建容器时,Docker 在后台运行的标准操作包括:
docker start
root@ba267838cc1b:/# ps
PID TTY TIME CMD
1 ? 00:00:00 bash
11 ? 00:00:00 ps
-d
参数来实现。docker run -d ubuntu:20.10 /bin/sh -c "while true; do echo hello world; sleep 1; done"
cbb72f51cf163590376fefe8444cbff7f8f44e38518bbf40fb799dcc2f4b0ff7
容器会返回一个唯一的id,也可以通过docker ps
命令来查看容器信息
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
cbb72f51cf16 ubuntu:20.10 "/bin/sh -c 'while t…" 14 seconds ago Up 12 seconds
可以使用docker logs
命令获取容器的输出信息
docker logs confident_swanson
hello world
hello world
hello world
hello world
. . .
docker stop
docker stop confident_swanson
confident_swanson
终止状态的容器可以使用docker ps -a
命令看到。
docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
cbb72f51cf16 ubuntu:20.10 "/bin/sh -c 'while t…" 3 minutes ago Exited (137) 12 seconds ago confident_swanson
36230771220f ubuntu:20.10 "/bin/echo 'hello wo…" 5 minutes ago Exited (0) 5 minutes ago epic_bhaskara
654a3c5ec3d1 bulletinboard:1.0 "docker-entrypoint.s…" 24 hours ago Exited (0) 13 hours ago bb
7fa85404b035 hello-world "/hello" 27 hours ago Exited (0) 27 hours ago
处于终止状态的容器,可以通过docker start
命令来重新启动。
docker start confident_swanson
confident_swanson
docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
cbb72f51cf16 ubuntu:20.10 "/bin/sh -c 'while t…" 5 minutes ago Up 9 seconds confident_swanson
36230771220f ubuntu:20.10 "/bin/echo 'hello wo…" 7 minutes ago Exited (0) 7 minutes ago epic_bhaskara
654a3c5ec3d1 bulletinboard:1.0 "docker-entrypoint.s…" 24 hours ago Exited (0) 13 hours ago bb
7fa85404b035 hello-world "/hello" 27 hours ago Exited (0) 27 hours ago
docker restart
命令会将一个运行态的容器终止,然后再重新启动。
6.进入容器
在使用 -d
参数时,容器启动后会进入后台。 某些时候需要进入容器进行操作,有很多种方法,包括使用docker attach
命令或 nsenter
工具等。
但是使用 attach
命令有时候并不方便。当多个窗口同时 attach 到同一个容器的时候,所有窗口都会同步显示。当某个窗口因命令阻塞时,其他窗口也无法执行操作了。
nsenter
工具在 util-linux 包2.23版本后包含。nsenter
可以访问另一个进程的名字空间。nsenter
要正常工作需要有 root 权限。
# nsenter -V
nsenter,来自 util-linux 2.23.2
为了连接到容器,你还需要找到容器的第一个进程的 PID,可以通过下面的命令获取。
docker inspect --format "{{ .State.Pid }}" <container>
通过这个 PID,就可以连接到这个容器:
nsenter --target $PID --mount --uts --ipc --net --pid
示例
$ sudo docker run -idt ubuntu Unable to find image 'ubuntu:latest' locally latest: Pulling from library/ubuntu a4a2a29f9ba4: Pull complete 127c9761dcba: Pull complete d13bf203e905: Pull complete 4039240d2e0b: Pull complete Digest: sha256:35c4a2c15539c6c1e4e5fa4e554dac323ad0107d8eb5c582d6ff386b383b7dce Status: Downloaded newer image for ubuntu:latest 93bd7a1a1bdf6293519649041fb28d70fcbe493fc70dbe281c6f31fed1499c10 $ sudo docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 93bd7a1a1bdf ubuntu "/bin/bash" 48 seconds ago Up 45 seconds fervent_lederberg $ docker inspect --format "{{ .State.Pid }}" fervent_lederberg 21525 $ sudo nsenter --target 21525 --mount --uts --ipc --net --pid root@93bd7a1a1bdf:/#
解析:
docker run -idt ubuntu
:-t
选项让docker分配一个伪终端并绑定到标准输入上,-i
让容器的标准输入保持打开,-i -t
通常同时出现。-d
以守护态运行容器,即容器在后台运行docker inspect --format "{{ .State.Pid }}" fervent_lederberg
:docker inspect
输出容器的低级信息,格式是Json
--format "{{ .State.Pid }}"
向输出结果传递参数,只查看Pid信息fervent_lederberg
容器名,上文通过docker ps
命令获取到的。nsenter
参数详解nsenter [options] [program [arguments]] options: -t, --target pid:指定被进入命名空间的目标进程的pid -m, --mount[=file]:进入mount命令空间。如果指定了file,则进入file的命令空间 -u, --uts[=file]:进入uts命令空间。如果指定了file,则进入file的命令空间 -i, --ipc[=file]:进入ipc命令空间。如果指定了file,则进入file的命令空间 -n, --net[=file]:进入net命令空间。如果指定了file,则进入file的命令空间 -p, --pid[=file]:进入pid命令空间。如果指定了file,则进入file的命令空间 -U, --user[=file]:进入user命令空间。如果指定了file,则进入file的命令空间 -G, --setgid gid:设置运行程序的gid -S, --setuid uid:设置运行程序的uid -r, --root[=directory]:设置根目录 -w, --wd[=directory]:设置工作目录 如果没有给出program,则默认执行$SHELL。
使用docker ps
命令查看本地的docker 进程
# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
654a3c5ec3d1 bulletinboard:1.0 "docker-entrypoint.s…" 10 hours ago Up 10 hours 0.0.0.0:8000->8080/tcp bb
使用docker inspect <NAME|ID>
查看容器的信息,返回数据格式是json
"docker inspect" requires at least 1 argument.
See 'docker inspect --help'.
Usage: docker inspect [OPTIONS] NAME|ID [NAME|ID...]
Return low-level information on Docker objects
# docker inspect 654a3c5ec3d1 [ { "Id": "654a3c5ec3d12af094cb8a685805fa651bcaa2e1c22c1d957807c667aceaf991", "Created": "2020-06-25T05:44:32.169640597Z", "Path": "docker-entrypoint.sh", "Args": [ "npm", "start" ], "State": { ... } } ]
docker export
导出本地上的某个容器
docker import
导入容器快照
docker rm
删除一个处于终止状态的容器。如果要删除一个运行中的容器,可以添加-f
参数。Docker 会发送 SIGKILL 信号给容器
*数据卷的使用,类似于 Linux 下对目录或文件进行 mount。
创建一个数据卷
在用 docker run
命令的时候,使用-v
标记来创建一个数据卷并挂载到容器里。在一次 run 中多次使用可以挂载多个数据卷。
*注意:也可以在 Dockerfile 中使用 VOLUME 来添加一个或者多个新的卷到由该镜像创建的任意容器。
挂载一个主机目录作为数据卷
使用 -v
标记也可以指定挂载一个本地主机的目录到容器中去。
Docker 挂载数据卷的默认权限是读写,用户也可以通过 :ro
指定为只读。
挂载一个本地主机文件作为数据卷(不推荐!)
-v
标记也可以从主机挂载单个文件到容器中
*注意:如果直接挂载一个文件,很多文件编辑工具,包括vi
或者 sed --in-place
,可能会造成文件 inode
的改变,从 Docker 1.1 .0起,这会导致报错误信息。所以最简单的办法就直接挂载文件的父目录。
数据卷容器
如果你有一些持续更新的数据需要在容器之间共享,最好创建数据卷容器。
数据卷容器,其实就是一个正常的容器,专门用来提供数据卷供其它容器挂载的。
首先,创建一个命名的数据卷容器 dbdata:
$ sudo docker run -d -v /dbdata --name dbdata training/postgres echo Data-only container for postgres
然后,在其他容器中使用 --volumes-from 来挂载 dbdata 容器中的数据卷。
$ sudo docker run -d --volumes-from dbdata --name db1 training/postgres
$ sudo docker run -d --volumes-from dbdata --name db2 training/postgres
还可以使用多个--volumes-from
参数来从多个容器挂载多个数据卷。 也可以从其他已经挂载了数据卷的容器来挂载数据卷。
$ sudo docker run -d --name db3 --volumes-from db1 training/postgres
*注意:使用 --volumes-from
参数所挂载数据卷的容器自己并不需要保持在运行状态。
如果删除了挂载的容器(包括 dbdata、db1 和 db2),数据卷并不会被自动删除。如果要删除一个数据卷,必须在删除最后一个还挂载着它的容器时使用docker rm -v
命令来指定同时删除关联的容器。 这可以让用户在容器之间升级和移动数据卷。具体的操作将在下一节中进行讲解。
利用数据卷容器来备份、恢复、迁移数据卷
可以利用数据卷对其中的数据进行进行备份、恢复和迁移。
备份
首先使用 --volumes-from 标记来创建一个加载 dbdata 容器卷的容器,并从本地主机挂载当前到容器的 /backup 目录。
$ sudo docker run --volumes-from dbdata -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /dbdata
容器启动后,使用了 tar 命令来将 dbdata 卷备份为本地的 /backup/backup.tar
8.恢复
如果要恢复数据到一个容器,首先创建一个带有数据卷的容器 dbdata2
$ sudo docker run -v /dbdata --name dbdata2 ubuntu /bin/bash
然后创建另一个容器,挂载 dbdata2 的容器,并使用 untar
解压备份文件到挂载的容器卷中。
$ sudo docker run --volumes-from dbdata2 -v $(pwd):/backup busybox tar xvf
/backup/backup.tar
外部访问容器
容器中可以运行一些网络应用,要让外部也可以访问这些应用,可以通过
−
P
-P
−P 或
−
p
-p
−p 参数来指定端口映射。
当使用
−
P
-P
−P 标记时,Docker 会随机映射一个 49000~49900 的端口到内部容器开放的网络端口。
-p
(小写的)则可以指定要映射的端口,并且,在一个指定端口上只可以绑定一个容器。支持的格式有ip:hostPort:containerPort | ip::containerPort | hostPort:containerPort
映射所有接口地址
使用 hostPort:containerPort
格式本地的 5000 端口映射到容器的 5000 端口,可以执行
$ sudo docker run -d -p 127.0.0.1:5000:5000 training/webapp python app.py
ip::containerPort
绑定 localhost 的任意端口到容器的 5000 端口,本地主机会自动分配一个端口。$ sudo docker run -d -p 127.0.0.1::5000 training/webapp python app.py
还可以使用 udp 标记来指定 udp 端口
$ sudo docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py
$ docker port nostalgic_morse 5000
127.0.0.1:49155.
注意:
容器有自己的内部网络和 ip 地址(使用 docker inspect 可以获取所有的变量,Docker 还可以有一个可变的网络配置。)
-p 标记可以多次使用来绑定多个端口
例如
$ sudo docker run -d -p 5000:5000 -p 3000:80 training/webapp python app.py
容器互联
容器的连接(linking)系统是除了端口映射外,另一种跟容器中应用交互的方式。
该系统会在源和接收容器之间创建一个隧道,接收容器可以看到源容器指定的信息。
自定义容器命名
连接系统依据容器的名称来执行。因此,首先需要自定义一个好记的容器命名。
虽然当创建容器的时候,系统默认会分配一个名字。自定义命名容器有2个好处:
自定义的命名,比较好记,比如一个web应用容器我们可以给它起名叫web
当要连接其他容器时候,可以作为一个有用的参考点,比如连接web容器到db容器
使用 --name
标记可以为容器自定义命名。
$ sudo docker run -d -P --name web training/webapp python app.py
使用 docker ps
来验证设定的命名。
$ sudo docker ps -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
aed84ee21bde training/webapp:latest python app.py 12 hours ago Up 2 seconds 0.0.0.0:49154->5000/tcp web
也可以使用 docker inspect
来查看容器的名字
$ sudo docker inspect -f "{{ .Name }}" aed84ee21bde
/web
注意:容器的名称是唯一的。如果已经命名了一个叫 web 的容器,当你要再次使用 web 这个名称的时候,需要先用docker rm 来删除之前创建的同名容器。
在执行 docker run
的时候如果添加 --rm
标记,则容器在终止后会立刻删除。注意,--rm
和 -d
参数不能同时使用。
--link
参数可以让容器之间安全的进行交互。$ sudo docker run -d --name db training/postgres
删除之前创建的 web 容器
$ docker rm -f web
然后创建一个新的 web 容器,并将它连接到 db 容器
$ sudo docker run -d -P --name web --link db:db training/webapp python app.py
此时,db 容器和 web 容器建立互联关系。
--link
参数的格式为 --link name:alias
,其中 name
是要链接的容器的名称,alias
是这个连接的别名。
使用 docker ps
来查看容器的连接
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
349169744e49 training/postgres:latest su postgres -c '/usr About a minute ago Up About a minute 5432/tcp db, web/db
aed84ee21bde training/webapp:latest python app.py 16 hours ago Up 2 minutes 0.0.0.0:49154->5000/tcp web
可以看到自定义命名的容器,db 和 web,db 容器的 names 列有 db 也有 web/db。这表示 web 容器链接到 db 容器,web 容器将被允许访问 db 容器的信息。
Docker 在两个互联的容器之间创建了一个安全隧道,而且不用映射它们的端口到宿主主机上。在启动 db 容器的时候并没有使用 -p 和 -P 标记,从而避免了暴露数据库端口到外部网络上。
Docker 通过 2 种方式为容器公开连接信息:
使用 env 命令来查看 web 容器的环境变量
$ sudo docker run --rm --name web2 --link db:db training/webapp env
. . .
DB_NAME=/web2/db
DB_PORT=tcp://172.17.0.5:5432
DB_PORT_5000_TCP=tcp://172.17.0.5:5432
DB_PORT_5000_TCP_PROTO=tcp
DB_PORT_5000_TCP_PORT=5432
DB_PORT_5000_TCP_ADDR=172.17.0.5
. . .
其中 DB_ 开头的环境变量是供 web 容器连接 db 容器使用,前缀采用大写的连接别名。
除了环境变量,Docker 还添加 host 信息到父容器的/etc/hosts
的文件。下面是父容器 web 的 hosts 文件
$ sudo docker run -t -i --rm --link db:db training/webapp /bin/bash
root@aed84ee21bde:/opt/webapp# cat /etc/hosts
172.17.0.7 aed84ee21bde
. . .
172.17.0.5 db
这里有 2 个 hosts,第一个是 web 容器,web 容器用 id 作为他的主机名,第二个是 db 容器的 ip 和主机名。 可以在 web 容器中安装 ping 命令来测试跟db容器的连通。
root@aed84ee21bde:/opt/webapp# apt-get install -yqq inetutils-ping
root@aed84ee21bde:/opt/webapp# ping db
PING db (172.17.0.5): 48 data bytes
56 bytes from 172.17.0.5: icmp_seq=0 ttl=64 time=0.267 ms
56 bytes from 172.17.0.5: icmp_seq=1 ttl=64 time=0.250 ms
56 bytes from 172.17.0.5: icmp_seq=2 ttl=64 time=0.256 ms
用 ping 来测试db容器,它会解析成 172.17.0.5。 *注意:官方的 ubuntu 镜像默认没有安装 ping,需要自行安装。
用户可以链接多个父容器到子容器,比如可以链接多个 web 到 db 容器上。
docker network create --driver=bridge --subnet=172.20.0.0/16 wkcrm_network
--driver
:设置网络类型为桥接(bridge)网络
--subnet
:设置子网网段
资料:
docker设置固定ip地址
https://www.cnblogs.com/xuezhigu/p/8257129.html
https://docs.docker.com/engine/reference/commandline/network_create/
docker network create
https://blog.csdn.net/zhizhuodewo6/article/details/87706638
systemctl enable docker.service
docker ps // 查看所有正在运行容器
docker stop containerId // containerId 是容器的ID
docker ps -a // 查看所有容器
docker ps -a -q // 查看所有容器ID
docker stop $(docker ps -a -q) // stop停止所有容器
docker rm $(docker ps -a -q) // remove删除所有容器
使用-rm标志运行容器对于那些用于非常短暂而只是为了完成某些事情的容器是有好处的,例如,在容器内编译应用程序,或者只测试它工作的东西,然后你知道它是一个短暂的容器并告诉你的Docker守护进程一旦运行完毕,擦除与之相关的所有内容并保存磁盘空间
在Docker容器退出时,默认容器内部的文件系统仍然被保留,以方便调试并保留用户数据。
但是,对于foreground容器,由于其只是在开发调试过程中短期运行,其用户数据并无保留的必要,因而可以在容器启动时设置–rm选项,这样在容器退出时就能够自动清理容器内部的文件系统。
https://blog.csdn.net/taiyangdao/article/details/73076770
解决方法:解决VMware Workstation 15 与Device/Credential Guard不兼容的问题
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
已加载插件:fastestmirror, langpacks
参数 docker 没有匹配
参数 docker-client 没有匹配
参数 docker-client-latest 没有匹配
参数 docker-common 没有匹配
参数 docker-latest 没有匹配
参数 docker-latest-logrotate 没有匹配
参数 docker-logrotate 没有匹配
参数 docker-engine 没有匹配
不删除任何软件包
sudo yum install -y yum-utils \
device-mapper-persistent-data \
lvm2
已加载插件:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
* base: mirrors.huaweicloud.com
* centos-sclo-rh: mirror.bit.edu.cn
* centos-sclo-sclo: mirror.bit.edu.cn
* epel: mirrors.yun-idc.com
* extras: mirror.bit.edu.cn
* updates: mirror.bit.edu.cn
软件包 yum-utils-1.1.31-54.el7_8.noarch 已安装并且是最新版本
软件包 device-mapper-persistent-data-0.8.5-2.el7.x86_64 已安装并且是最新版本
软件包 7:lvm2-2.02.186-7.el7_8.2.x86_64 已安装并且是最新版本
无须任何处理
使用阿里源地址设置稳定的仓库
sudo yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
已加载插件:fastestmirror, langpacks
adding repo from: http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
grabbing file http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo to /etc/yum.repos.d/docker-ce.repo
repo saved to /etc/yum.repos.d/docker-ce.repo
sudo yum install docker-ce docker-ce-cli containerd.io
已加载插件:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
...
更新完毕:
docker-ce.x86_64 3:19.03.12-3.el7 docker-ce-cli.x86_64 1:19.03.12-3.el7
完毕!
yum list docker-ce --showduplicates | sort -r 已加载插件:fastestmirror, langpacks 已安装的软件包 可安装的软件包 * updates: mirror.bit.edu.cn Loading mirror speeds from cached hostfile * extras: mirror.bit.edu.cn * epel: mirrors.yun-idc.com docker-ce.x86_64 3:19.03.9-3.el7 docker-ce-stable docker-ce.x86_64 3:19.03.8-3.el7 docker-ce-stable docker-ce.x86_64 3:19.03.7-3.el7 docker-ce-stable ... docker-ce.x86_64 17.03.2.ce-1.el7.centos docker-ce-stable docker-ce.x86_64 17.03.1.ce-1.el7.centos docker-ce-stable docker-ce.x86_64 17.03.0.ce-1.el7.centos docker-ce-stable * centos-sclo-sclo: mirror.bit.edu.cn * centos-sclo-rh: mirror.bit.edu.cn * base: mirrors.huaweicloud.com
通过其完整的软件包名称安装特定版本,该软件包名称是软件包名称(docker-ce)加上版本字符串(第二列),从第一个冒号(:)一直到第一个连字符,并用连字符(-)分隔。例如:docker-ce-18.09.1。
sudo yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io
sudo systemctl start docker
出现docker.io: net/http: TLS handshake timeout.问题的解决方法
vim /etc/docker/daemon.json
加入以下内容:
{
"registry-mirrors": [
"https://dockerhub.azk8s.cn",
"https://hub-mirror.c.163.com"
]
}
重启dockersystemctl restart docker
,使用docker info
看配置是否生效
参考资料:https://zhuanlan.zhihu.com/p/164920268
sudo docker run hello-world Unable to find image 'hello-world:latest' locally latest: Pulling from library/hello-world 0e03bdcc26d7: Pull complete Digest: sha256:d58e752213a51785838f9eed2b7a498ffa1cb3aa7f946dda11af39286c3db9a9 Status: Downloaded newer image for hello-world:latest Hello 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 bash Share 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/
docker image ls
列出下载到计算机上的镜像hello-world
显示消息后退出的容器(由图像生成)。如果它仍在运行,则不需要以下--all
选项pip install docker-compose
资料:
https://blog.csdn.net/q0717168/article/details/109361349
git clone https://github.com/dockersamples/node-bulletin-board
cd node-bulletin-board/bulletin-board-app
# 使用官方镜像作为父镜像 FROM node:current-slim # 设置工作目录 WORKDIR /usr/src/app # 将文件从主机复制到当前位置 COPY package.json . # 在镜像文件系统中运行该命令 RUN npm install # 通知Docker容器在运行时监听指定的端口 EXPOSE 8080 # 在容器中运行指定的命令 CMD [ "npm", "start" ] # 将应用程序的其余源代码从主机复制到镜像文件系统 COPY . .
docker build
命令通过Dockerfile文件构建镜像docker build --tag bulletinboard:1.0 . Sending build context to Docker daemon 45.57kB Step 1/7 : FROM node:current-slim current-slim: Pulling from library/node 7d2977b12acb: Pull complete 23e9a36a6e2d: Pull complete 831103f0eed4: Pull complete f172d5646bed: Pull complete 9f1d0c9b6ec5: Pull complete Digest: sha256:4f837156a4bc43b6c8af7195dd7dbfc0b46e6f3515f777e2cb53139dc4faee33 Status: Downloaded newer image for node:current-slim ---> 0e2e78467169 ... Step 6/7 : CMD [ "npm", "start" ] ---> Running in 5fb8e209296e Removing intermediate container 5fb8e209296e ---> 609ae5029141 Step 7/7 : COPY . . ---> 2cfe87792e72 Successfully built 2cfe87792e72 Successfully tagged bulletinboard:1.0
Successfully tagged bulletinboard:1.0
看到这个说明镜像构建成功
docker run --publish 8000:8080 --detach --name bb bulletinboard:1.0
–publish 要求Docker将主机端口8000上传入的流量转发到容器的端口8080。容器具有自己的专用端口集,因此,如果要从网络访问某个端口,则必须以这种方式将流量转发到该端口。否则,作为默认的安全状态,防火墙规则将阻止所有网络流量到达您的容器。
–detach 要求Docker在后台运行此容器。
–name 指定一个名称,在后续命令中,您可以使用该名称来引用您的容器bb
docker rm --force bb
docker login
登录Docker Hubdocker login
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username:
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
<Your Docker ID>/<Repository Name>:<tag>
docker tag bulletinboard:1.0 <Your Docker ID>/bulletinboard:1.0
docker push <Your Docker ID>/bulletinboard:1.0
在官方仓库的mysql镜像页面也有较为详细的描述。传送门
Dockerfile和docker-entrypoint.sh
获取地址
- 本地新建配置文件
/home/mysql_config_volume/my.cnf
直接外挂配置文件修改端口的方式是不行的,因为镜像在构建时设置的监听端口是3306或33060,外挂的配置文件修改端口为别的会出现错误,mysql无法启动,在XXX路径下确实套接字文件
docker pull mysql:5.7.30
docker pull mysql:5.7.30
docker run --name mysqldef -e MYSQL_ROOT_PASSWORD=123456 -p 8060:8060 -d mysql:5.7.30
docker ps
查看运行状态和iddocker cp 95e2bc0c1955:/etc/mysql/my.cnf /home
docker cp 95e2bc0c1955:/etc/mysql/cnf.d /home
docker cp 95e2bc0c1955:/etc/mysql/conf.d /home
docker cp 95e2bc0c1955:/etc/mysql/mysql.cnf /home
docker cp 95e2bc0c1955:/etc/mysql/mysql.conf.d /home
挨个查看后mysql.cnf
内有如下内容:
# Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
#
# This program is free software; you can redistribute it and/or modify
#...
#...
#...
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
!includedir /etc/mysql/conf.d/
!includedir /etc/mysql/mysql.conf.d/
说明该文件是引用/etc/mysql/conf.d/ 和 /etc/mysql/mysql.conf.d/
打开后查看,发现有[mysql]
字段
[mysql]
mysqld.cnf
内有如下字段,so,这个就可以作为配置文件
# Copyright (c) 2014, 2016, Oracle and/or its affiliates. All rights reserved. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License, version 2.0, # as published by the Free Software Foundation. # # This program is also distributed with certain software (including # but not limited to OpenSSL) that is licensed under separate terms, # as designated in a particular file or component or in included license # documentation. The authors of MySQL hereby grant you an additional # permission to link the program and your derivative works with the # separately licensed software that they have included with MySQL. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License, version 2.0, for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # # The MySQL Server configuration file. # # For explanations see # http://dev.mysql.com/doc/mysql/en/server-system-variables.html [mysqld] pid-file = /var/run/mysqld/mysqld.pid socket = /var/run/mysqld/mysqld.sock datadir = /var/lib/mysql #log-error = /var/log/mysql/error.log # By default we only accept connections from localhost #bind-address = 127.0.0.1 # Disabling symbolic-links is recommended to prevent assorted security risks symbolic-links=0
在复制到本地的mysqld.cnf
内加入以下内容:
#[mysqld]下追加
init_connect='SET collation_connection = utf8_unicode_ci'
init_connect='SET NAMES utf8'
character-set-server=utf8
collation-server=utf8_unicode_ci
skip-character-set-client-handshake
port=8060
#新增
[client]
default-character-set=utf8
#新增
[mysql]
default-character-set=utf8
mysql:5.7.30
的DockerFile文件,进行修改后重新构建镜像EXPOSE 3306 33060 改为 EXPOSE 8060
文件最下方的
RUN ln -s usr/local/bin/docker-entrypoint.sh /entrypoint.sh # backwards compat
改为
RUN chmod 777 /usr/local/bin/docker-entrypoint.sh \
&& ln -s /usr/local/bin/docker-entrypoint.sh /
docker build --tag tutumysqldef:1.0 .
开始构建镜像如果
Get:5 http://deb.debian.org/debian XXX XXX Packages [XXX kB]
速度过慢,可以考虑换源
在dockerfile同级路径下创建source.list
,在里面添加如下内容
deb https://mirrors.aliyun.com/debian/ jessie main non-free contrib
deb https://mirrors.aliyun.com/debian/ jessie-updates main non-free contrib
deb https://mirrors.aliyun.com/debian/ jessie-backports main non-free contrib
deb-src https://mirrors.aliyun.com/debian/ jessie main non-free contrib
deb-src https://mirrors.aliyun.com/debian/ jessie-updates main non-free contrib
deb-src https://mirrors.aliyun.com/debian/ jessie-backports main non-free contrib
deb https://mirrors.aliyun.com/debian-security/ jessie/updates main non-free contrib
deb-src https://mirrors.aliyun.com/debian-security/ jessie/updates main non-free contrib
在dockerfile文件下追加
mv /etc/apt/sources.list /etc/apt/sources.list.bak \ mv sources.list /etc/apt/
这两行代码
FROM debian:buster-slim
# add our user and group first to make sure their IDs get assigned consistently, regardless of whatever dependencies get added
RUN groupadd -r mysql && useradd -r -g mysql mysql
RUN apt-get update && apt-get install -y --no-install-recommends gnupg dirmngr && rm -rf /var/lib/apt/lists/* \
mv /etc/apt/sources.list /etc/apt/sources.list.bak \
mv sources.list /etc/apt/
重新执行构建命令
ps:构建过程挺费时间的
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。