Docker笔记(2):Docker的基本使用与配置

本文详细介绍了Docker中镜像和容器的管理,包括查找、拉取、查看、删除镜像,以及创建、启动、停止、删除容器的操作。还涉及容器的网络配置,如端口映射、容器互联和自定义网络创建。此外,讨论了数据管理,如数据卷和数据卷容器的使用,以及容器间数据的持久化。最后提到了容器的端口映射和安全互联策略。
摘要由CSDN通过智能技术生成

1、镜像、容器的相关命令

1.镜像相关命令

(1)镜像查找

docker search NAME

(2)镜像拉取

用docker run命令从镜像启动一个容器时,如果该镜像不在本地,Docker会先从Docker hub下载该镜像。Registry默认为registry.hub.docker.com,TAG默认为latest。

docker pull [Registry]/NAME:TAG
docker pull ubuntu:16.04

(3)镜像信息查看

# 查看已经拉取的镜像,存储在宿主机的/var/lib/docker目录下
docker images
# 查看镜像的详细信息,返回一个Json字符
docker inspect imageID
# 可以使用-f指定要查看的信息
docker inspect -f {{".Config.ExposedPorts"}} tomcat

(4)镜像删除

当同一个镜像拥有多个标签的时候,docker rmi命令只是删除了该镜像多个标签中的指定标签而已,并不影响镜像文件,当镜像只剩一个标签的时候,执行docker rmi命令会删除该镜像。

当有容器是基于该镜像创建的时候,docker rmi命令是无法删除该镜像的。不推荐使用 -f 参数强制删除镜像,被强制删除的镜像会换了一个新的ID继续存在于系统中。正确的做法是先删除容器,然后删除镜像。

docker rmi imageID
# 删除全部docker镜像
docker rmi `docker images -q`

(5)镜像导出导入

使用docker save命令,用来将一个或多个image打包成tar文件。

docker save -o <保存路径> <镜像名称:标签>
docker save -o tomcat.tar tomcat:v1.0

将tomcat.tar文件移植到其他的计算机上,可以使用docker load命令加载镜像。如果本地镜像库已经存在该镜像,将会被覆盖。

docker load --input tomcat.tar

docker save的应用场景是,如果你的应用是使用docker-compose.yml编排的多个镜像组合,但你要部署的服务器并不能连外网。这时,你可以使用docker save将用到的镜像打个包,然后拷贝到客户服务器上使用docker load载入。

(6)镜像的上传

使用docker push命令将自己的镜像上传到registry.hub.docker.com,需要注册账户。

2.容器相关命令

(1)创建交互式容器

docker run命令,等价于docker create + docker start 命令,容器启动后进入容器。

docker run -it ubuntu --name myName /bin/bash

-i 参数是让容器的标准输入STDIN保持打开。使用Ctrl+D或exit命令退出容器。

-t 参数表示创建交互式容器,让docker为容器分配一个伪tty终端,并绑定在标准输入STDIN上。

-t和-i标志为我们执行的进程创建了伪tty终端并捕捉STDIN,若要在命令行下创建一个能与之进行交互的容器,则这两个参数已经是最基本的参数了。

docker run命令的执行过程如下:

img

(2)创建守护式容器

守护式容器启动后会进入后台,用户无法进入容器,看到容器里面的信息。

docker run --name deamon_ubuntu -d ubuntu /bin/sh -c "while true;do echo hello world;sleep 1; done"

通过如下命令查看容器打印的日志:

# 使用-f表示持续不断的打印日志,通过Ctrl+C退出追踪日志
docker logs -f deamon_ubuntu

查看容器内的进程:

docker top deamon_ubuntu

(3)进入容器命令行

1)attach方式: 容器处于运行状态,可以通过attach命令重新进入容器的命令行,退出命令行后,容器也会停止运行。当多个窗口同时attach到同一个容器的时候,所有窗口都会同步显示,当某个窗口因命令阻塞时,其他窗口也无法执行操作了。

docker attach deamon_ubuntu

2)exec方式: docker1.3之后,可以通过docker exec命令在容器内部额外启动新进程,新的进程有两种类型:后台任务和交互式任务。后台任务在容器内运行且没有交互需求,而交互式任务则保持在前台运行。交互式任务,如打开容器的命令行:

docker exec -it deamon_ubuntu bash

3)attach与exec主要区别如下:

  • attach直接进入容器启动命令的终端,不会启动新的进程。
  • exec则是在容器中打开新的终端,并且可以启动新的进程。
  • 如果想直接在终端中査看启动命令的输出,用attach;其他情况使用exec。

如果某容器中只启动了一个命令行,用户通过exit命令或ctrl+d来退出终端时,所创建的容器立刻终止。

(4)暂停容器

有时我们只是希望让容器暂停工作一段时间,比如要对容器的文件系统打个快照,或宿主机需要使用CPU,这时可以执行docker pause。处于暂停状态的容器不会占用CPU资源,直到通过 docker unpause恢复运行。

(5)自动重启容器

如果因为某种错误而导致容器停止运行,默认情况下docker不会重启容器,可以通过–restart参数让Docker自动重新启动该容器。–restart会检查容器的退出代码,并据此决定是否要重启容器。restart的参数值包括always、on-failure;

# 无论容器因何种原因退出(包括正常退出),都立即重启
--restart = always
# 当容器退出代码为非0时,Docker会尝试自动重启该容器,最多重启5次
--restart = on-failure:5

(6)终止容器运行

docker stop命令终止一个运行中的容器,它会首先向容器发送SIGTERM信号,等待一段时间后(默认为10秒),再发送 SIGKILL信号终止容器。如果想快速停止容器,可使用docker kill命令,其作用是直接向容器进程发送SIGKILL信号。

docker stop ubuntu

Docker容器中指定的应用终结时,容器也自动终止。例如某容器只启动了一个命令行,用户通过exit命令或ctrl+d来退出命令行时,该容器会立刻终止。

(7)导出导入容器

docker export是用来将container的文件系统打包成tar文件,不管此时这个容器是否处于运行状态。可将这个文件传输到其他机器上,在其他机器上通过导入命令实现容器的迁移。然后使用docker import命令导入,导入成为镜像,加入本地库。

docker export container > container.tar
docker import container.tar imagename:version

docker export的应用场景主要用来制作基础镜像,比如从一个ubuntu镜像启动一个容器,然后安装一些软件和进行一些设置后,使用docker export保存为一个基础镜像。然后,把这个镜像分发给其他人使用,比如作为基础的开发环境。

docker save/load和docker export/import的区别:

  • docker save保存的是镜像(image),docker export保存的是容器(container);
  • docker save
  • docker load用来载入镜像包,docker import用来载入容器包,但两者都会恢复为镜像;
  • docker load不能对载入的镜像重命名,而docker import可以为镜像指定新名称。
  • docker save将保存完整记录,内部包含重复文件,体积较大,docker export丢弃了所有的历史记录和元数据信息,无重复文件,仅保存容器当时的快照状态。

详细的区别见文章:https://blog.csdn.net/liukuan73/article/details/78089138。

(8)容器直接保存为镜像

有时候需要在基础镜像里面安装某些依赖,如果把命令写在Dockerfile里,部分依赖软件下载很慢,构建镜像的时候又会花很长的时间,所以最好是封装一个包含依赖库的新镜像。commit方式可以用于构建自定义的容器,但并不推荐使用该方式,仍推荐Dockerfile。

docker commit mynginx mynginx_i

(9)容器的批量操作

停用全部运行中的容器:

docker stop $(docker ps -q)

删除全部容器:

docker rm $(docker ps -aq)

一条命令实现停用并删除容器:

docker stop $(docker ps -q) & docker rm $(docker ps -aq)

(10)查看容器运行数据

通过以下命令查看容器运行的各种数据

docker inspect 容器名称(容器ID)

通过如下命令直接输出IP地址

docker inspect --format='{{.NetworkSettings.IPAddress}}' 容器名称(容器ID)

2、容器数据管理

在Docker中,要想实现数据的持久化(即数据不随着Container的结束而结束),需要将数据从宿主机挂载到容器中。容器中管理数据主要有两种方式:

  • 数据卷(Data Volumes)
  • 数据卷容器(Data Volume Containers)
1.数据卷

数据卷是一个可供容器使用的特殊目录,数据卷的使用,类似于 Linux下对目录或文件进行 mount操作。它绕过文件系统,可以提供很多有用的特性:

  • 数据卷可以在容器之间共享和重用。
  • 对数据卷的修改会立马生效。
  • 对数据卷的更新,不会影响镜像。
  • 卷会一直存在,直到没有容器使用。

Docker有两种类型的卷,每种类型都在容器中存在一个挂载点,但其在宿主机上位置有所不同:

Bind mount volume(绑定挂载卷): 需要在宿主机和容器内各指定一个特定的路径作为挂载点,两个挂载点建立关联关系;

Docker-managed volume(docker管理卷): 只需要在容器内指定容器的挂载点,宿主机上的挂载点固定在/var/lib/docker/volumes目录下,这种方式极大解脱用户在使用卷时的耦合关系,当容器内挂载点包含数据的时候,可以将容器挂载点的数据复制到宿主机的挂载点。

(1)Bind mount volume

可以在创建容器的时候,将宿主机的目录与容器内的目录进行映射,这样就可以通过修改宿主机某个目录的文件从而去影响容器。 这个功能在进行测试的时候十分方便,比如用户可以放置一些程序或数据到本地目录中,然后在容器内运行和使用。

另外,目录的路径必须是绝对路径,如果目录不存在,Docker会自动创建。Docker挂载数据卷的默认权限是读写(rw),用户也可以通过ro指定为只读,在容器中无法对bind mount volume数据进行修改,只有宿主机有权修改数据,提高了安全性。创建容器时,-v参数后边为宿主机目录:容器目录。例如:

# 加了:ro之后,容器内挂载的数据卷的数据就无法修改了。 
docker run -d -v /src/webapp:/opt/webapp:ro ubuntu

如果共享的是多级的目录,可能会出现权限不足的提示,需要添加参数 –privileged=true 来解决挂载的目录没有权限的问题。

(2)Docker-managed volume

在用 docker run命令的时候,使用-v标记可以在容器内创建一个数据卷,不需要指定宿主机目录,使容器与宿主机解耦合,多次使用-v标记可以创建多个数据卷。

docker run -d -v /usr/local/ --name=mycentos3 centos
2.数据卷容器

如果用户需要在多个容器之间共享一些持续更新的数据,最简单的方式是使用数据卷容器。数据卷容器其实就是一个普通的容器,专门用它提供数据卷供其他容器挂载使用方法如下。

首先,创建一个数据卷容器dbdata ,并在其中创建一个数据卷挂载到/dbdata。

docker run -it -v /dbdata --name dbdata ubuntu

然后,可以在其他容器中使用–volumes-from来挂载dbdata容器中的数据卷,例如创建db1和db2两个容器,并从dbdata容器挂载数据卷。容器db1和db2都挂载同一个数据卷到相同的/dbdata目录。三个容器任何方在该目录下的写人,其他容器都可以看到。

docker run -it --volumes-from dbdata --name db1 ubuntu
docker run -it --volumes-from dbdata --name db2 ubuntu
docker run --volumes-from dbdata -v /cxj --name db3 ubuntu
docker run -d --volumes-from dbl --name db4 ubuntu

可以多次使用–volumes-from参数来从多个容器挂载多个数据卷,还可以从其他已经挂载了容器卷的容器来挂载数据卷。使用–volumes-from参数被挂载的数据卷容器(dbdata)自身并不需要保持在运行状态。如果删除了挂载的容器(db1、db2、db3),数据卷并不会被自动删除。如果要删除一个数据卷,必须在删除最后一个还挂载着它的容器时显式使用 docker rm -v命令来指定同时删除关联的容器。

3.容器文件拷贝
# 宿主机 to 容器
docker cp 宿主文件或目录 容器名称:容器目录
docker cp /host/aaa containerName:/container/aaa
# 容器 to 宿主机
docker cp 容器名称:容器目录 宿主机文件或目录

3、网络的基本配置

1.端口映射实现访问容器

在启动容器的时候,如果不指定对应参数,在容器外部是无法通过网络来访问容器内的网络应用和服务的。可以通过-P或-p参数来指定端口映射。当使用-P标记时,Docker会随机映射一个4900-49900的端口至容器内部开放的网络端口;使用-p参数可以指定需映射的端口,多次使用-p标记可以绑定多个端口。默认为tcp端口,也可指定映射udp端口。

docker run -d -p hostPort:containerPort/udp --name=tomcat tomcat

查看容器的端口映射配置,可以查询容器指定的端口。

docker port container [port]
2.容器互联

docker连接系统允许将多个容器连接在一起,共享连接信息。docker连接会创建一个父子关系,其中父容器可以看到子容器的信息。使用–link参数可以让容器之间安全的进行交互。

Docker在两个互联的容器之间创建了一个安全隧道,而且不用映射它们的端口到宿主主机上。在启动db容器的时候并没有使用-p和-P标记,从而避免了暴露数据库端口到外部网络上。

docker run -it --name linktest --link redis:db ubuntu

–link标志创建了两个容器间的父子连接。这个标志需要两个参数:一个是要连接的容器名字,另一个是连接后容器的别名。别名让我们可以访问公开的信息,而无须关注底层容器的名字。连接让父容器有能力访问子容器,并且把子容器的一些连接细节分享给父容器,这些细节有助于配置应用程序并使用这个连接。

–link连接在安全方面也有好处,启动Redis容器时,不需要使用-p标志公开Redis的端口。通过把容器连接在一起,可以让父容器直接访问任意子容器的公开端口,并且只有使用–link标志才能连接到redis端口。redis容器的端口不需要对本地宿主机公开,通过这个安全模型,就可以限制容器化应用程序的被攻击面,减少应用暴露的网络。

出于安全原因(或者其他原因),可以强制 Docker只允许有连接的容器之间互相通信。需要在启动Docker守护进程时加上–ic= false标志,关闭所有没有连接的容器间的通信。被连接的容器必须运行在同一个 Docker宿主机上。不同 Docker宿主机上运行的容器无法连接。

Docker在父容器里的以下两个地方写入了连接信息:

  • /etc/hosts文件中: Docker容器重新启动后,容器的IP地址可能会发生变化,从Docker1.3开始,如果被连接的容器重启了,/etc/host文件中的IP地址会更新为新的IP地址。
  • 包含连接信息的环境变量中: 环境变量中包含一些以DB开头的环境变量,Docker在连接webapp和redis容器时,自动创建了这些以DB开头的环境变量。这些环境变量会随容器的变化而变化,取决于容器是如何配置的(如容器的Dockerfile中里由ENV和EXPOSE指令定义的内容)。更重要的是,这些连接信息可以让容器内的应用程序使用相同的方法与别的容器进行连接,而不用关心被连接的容器的具体细节。
3.自定义网络创建

(1)新建网络

下面先创建一个新的 Docker 网络。-d:参数指定 Docker 网络类型,有 bridge、overlay。其中 overlay 网络类型用于 Swarm mode,

docker network create -d bridge test-net

(2)连接容器

运行新的容器并连接到新建的 test-net 网络:

docker run -it --name test1 --network test-net ubuntu /bin/bash docker run -it --name test2 --network test-net ubuntu /bin/bash

(3)连接验证

通过ping来证明test1容器和test2容器建立了互联关系。如果test1、test2容器内中无ping命令,则在容器内执行以下命令安装 ping。

apt-get update
apt install iputils-ping

如果有多个容器之间需要互相连接,推荐使用Docker Compose。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值