docker基本使用
一,使用Docker镜像
① 获取镜像
1, 命令: docker pull NAME[:TAG]。(描述镜像需要使用名称+标签)
docker pull ubuntu:18.04
2, 如果不指定标签也就是TAG,那会默认选择最新版本的镜像
3, 非官方仓库下载,需要制定完整仓库名称
docker pull hub.c.163.com/public/ubuntu:18.04
4, 使用代理
在docker服务启动配置中加上--registry-mirror=proxy URL
来指定代理服务地址。
② 查看镜像信息
1,查看本机镜像
docker images
或者docker image ls
2, 使用tag命令添加镜像标签
docker tag ubuntu:latest myubuntu:latest
3, 使用inspect命令查看详细信息
docker [image] inspect ubuntu:18.04
③ 搜寻镜像
docker search [option] keyword
示例: docker search --filter=is-official=true nginx
示例: 搜索收藏数超过4的关键词包括TensorFlow的镜像
docker search --filter=stars=4 tensorflow
④ 删除与清理镜像
1,使用标签删除镜像
格式: docker rmi [IMAGE...] 其中IMAGE可以是标签或者ID
docker rmi
或者 docker image rm
参数:
-f --force 强制删除镜像,即使有容器依赖于他
-no-prune 不要清理未带标签的父镜像
例如,要删除掉myubuntu:latest的镜像
docker rmi myubuntu:latest
当同一个镜像存在多个标签的时候,docker rmi 仅仅删除了该镜像多个标签中的指定标签,并不影响镜像文件。相当于只是删除原本镜像的一个标签副本。
但是当镜像只有一个标签时候,就会删掉镜像
2, 使用镜像ID删除镜像
当使用docker rmi命令后加上镜像的ID,会尝试删除所有指向镜像的标签,然后删除该镜像文件本身
当镜像文件上已经存在容器时,镜像文件默认无法被删除。
3, 清理镜像
docker image prune
来清理临时镜像或者是没有被使用的镜像
参数:
-a, -all 删除所有无用的镜像,不仅仅是临时镜像
-filter 清理符合给定过滤器的镜像
-f, -force 强制清理镜像,并且不提示
例如:自动清理临时的镜像文件层
docker image prune -f
⑤ 创建镜像
创建镜像的方法主要有三种:
基于已有镜像的容器创建、基于本地模板导入、基于Dockerfile创建。
基于已有容器创建
方法:
docker [container] commit
命令格式为docker [container] commit [options] container [pepository[:TAG]]
-a, --author="": 作者信息;
-c, --change=[]: 提交的时候执行Dockerfile指令,包括CMD|ENTRYPOINT|ENV|EXPOSE|LABEL|ONBILD|USER|VOLUME|WORKDIR等;
-m --message="":提交消息;
-p, --pause=true:提交时暂停容器运行。
docker run -it ubuntu:18.04 /bin/bash
此时改容器已经和原ubuntu:18.04镜像相比,已经发生改变,可以使用docker [container] commit命令来提交为一个新的镜像。提交时可以使用ID或名称来指定容器:
docker [container] commit -m "新的Ubuntu镜像" -a "zhouxiansheng" a9378cdb test:0.1
基于本地模板导入
docker [container] import
cat ubuntu-18.04-x86_64-minimal.tar.gz | docker import - ubuntu:18.04
基于Dockerfile创建
了解即可
二, 操作Docker容器
容器是Docker的另一个核心概念。简单的说,容器是镜像的一个运行实例。所不同的是,镜像是静态的制度文件,而容器带有运行时需要的可写文件层,同时,容器中的应用进程处于运行状态。
① 创建容器
1, 新建容器
可以使用docker [container] create命令新建一个容器,例如:
docker create -it ubuntu:latest
使用docker [container] create 命令新建的容器处于停止状态,可以使用docker [container] start 命令来启动它;
2, 启动容器
docker start id
使用docker ps
查看已经启动的命令
3, 新建并启动容器
除了创建容器后通过start命令来启动,也可以直接新建并启动容器。
所需要的命令主要为docker [container] run,等价于先执行docker [container] create命令,再执行docker [container] start命令。
docker run ubuntu /bin/echo "hello world"
当利用docker [container] run 来创建并启动容器是,Docker在后台的标准操作包括:
- 检查本地是否存在指定镜像,不存在就从公有仓库下载
- 利用镜像创建一个容器,并启动该容器;
- 分配一个文件系统给容器,并在只读的镜像层在外面挂在一层可读写层
- 从网桥的地址池配置一个IP地址给容器
- 执行用户指定的应用程序
- 执行完毕后容器被自动终止
启动一个bash终端,允许用户进行交互:
使用exit或者Command + d退出
对于所创建的bash容器,当用户使用exit退出bash进程会后,容器使命完成,也就没有继续运行的必要了
可以使用docker container wait [CONTAINER...]子命令来等待容器退出,并打印退出返回结果。
4, 守护态运行
更多的时候需要让docker以守护态的形式运行。此时通过可以添加-d参数来实现。
docker run -d ubuntu /bin/sh -c "while true; do echo hello; sleep 1;done"
容器启动之后会返回为一个id,也可以通过docker ps 或者docker container ls 来查看容器信息
5, 查看容器输出
docker [container] logs
- -details :打印详细信息
- -f, -follow: 持续保持输出
- -since string: 输出从某个时间开始的日志
- -tail string : 输出最近若干日志
- -t, -timestamps: 显示时间戳信息
- -until string: 输出某个时间之前的日志
例如:docker logs 10199b99f318c
② 停止容器
1, 暂停容器
可以使用docker [container] pause CONTSINER [CONTAINER...] 命令来暂停一个运行中的容器
先启动一个容器
docker run -d --name test --rm -it ubuntu bash
docker pause test
2, 终止容器
docker stop stop
3, 查看所有容器ID
docker ps -qa
4, 重启容器
- 对于已经关闭的容器
docker start 10199
- 对于正在运行的容
docker restart 10199
5, 进入容器
在使用-d参数,容器进入后台进入后台,用户无法看到容器中的信息,也无法进行操作。这个时候如果进入容器进行操作使用attach或者exec命令。
attach命令
attach是Docker自带的命令,命令格式为:
docker [container] attach [--detach-keys[=[]]] [--no-stdin] [--sig-proxy[=true]] CONTAINER
例如:
缺点:当多窗口同时attach到同一个容器的时候;当某一个窗口命令阻塞,其他窗口也无法使用。
exec命令
docker [container] exec [-d|--detach] [--detach-keys[=[]]] [-i|--interactive] [--privileged] [-t|--tty] [-u|--user[=USER]] CONTAINER COMMAND [ARG...]
例如:进入容器中启动一个/bash:
6, 删除容器
可以使用docker [container] rm 命令来删除处于终止状态或退出状态的容器,命令格式为docker [container] rm [-f|--force] [-l|--link] [-v|--volumes] CONTAINER [CONTAINER...]
docker ps -a
docker rm 10199
7, 查看容器
1, 查看容器详情
可以使用docker container inspect [OPTIONS] CONTAINER [CONTAINER...]子命令。
2,查看容器内进程
查看容器内进程可以使用docker [container] top [OPTIONS] CONTAINER [CONTAINER...]子命令
这个子命令类似于Linux中的top命令,会打印出容器内的进程信息,包括PID、用户、时间、命令等。例如查看某容器内进程信息,命令如下:
docker top f6
3, 查看统计信息
查看统计信息可以使用docker [container] stats [OPTIONS] [CONTAINER...]子命令
8, 其他命令
1, 复制文件
docker [container] cp data test:/tmp/
将本地路径data复制到test容器的/tmp路径下:
2, 查看变更
docker container diff test
查看test容器内的数据修改
3, 查看端口映射
container port命令可以查看容器的端口映射情况。命令格式为docker container port CONTAINER
docker container port test
查看test容器的端口映射情况
4, 更新配置
限制总配额为1s,容器test所占时间为10%
docker update --cpu-quota 1000000 test
三, 搭建本地私有仓库
1, 使用registry镜像创建私有仓库
安装Docker后,可以通过官方提供的registry镜像来简单搭建一套本地私有仓库环境:
docker run -d -p 5000:5000 registry:2
这将自动下载并启动一个registry容器,创建本地的私有仓库服务。
默认情况下,仓库会被创建在容器中的/var/lib/registry目录下。可以通过-v参数来讲镜像文件存放在本地的指定路径。例如:上传镜像放到/opt/data/registry目录:
docker run -d -p 5000:5000 -v /opt/data/registry:/var/libregistry registry:2
此时本地将启动一个私有的仓库服务,监听端口为5000
四, Docker数据管理
在生产环境中使用Docker,需要对数据进行持久化,或者需要在多个容器间进行数据共享,这必然涉及到容器的数据管理操作。
容器管理数据的方式有两种
- 数据卷:容器内数据直接映射到本地主机环境;
- 数据卷容器:使用特定容器维护数据卷
1, 数据卷
数据卷是一个可供容器使用的特殊目录,他将主机操作系统目录直接映射到容器,类似于Linux的mount行为。
- 数据卷可以在容器间共享使用
- 数据修改立即生效
- 对数据卷的更新不会影响镜像
- 卷会一直存在,直到没有容器使用
① 创建数据卷
Docker提供volume子命令来管理数据卷,如下命令可以快速在本地创建一个数据卷:
docker volume create -d loacl test
创建一个名为python的自定义容器卷
docker volume ls
查看所有容器卷
docker volume inspect python
查看python容器卷的详细信息
② 绑定数据卷
除了使用volume子命令来管理数据卷外,还可以在创建容器时将主机本地的任意数据路径挂在到容器内作为数据卷,这种形式创建的数据卷称为绑定数据卷。
再用docker [container] run命令的时候,可以使用-mount选项来使用数据卷-mount选项支持三种类型的数据卷,包括:
- volume:普通数据卷,映射到主机路径下
- bind:绑定数据卷,映射到指定路径下
- tmpfs:临时数据卷,只存在于内存中
有了自定义容器卷,我们可以创建一个使用这个数据卷的容器,这里我们以nginx为例:
docker run -d -it --name=python -p 8800:80 -v python:/usr/share/nginx/html nginx
使用-v代表挂在数据卷
现在docker run -d -P --name=python --mount type=bind,source=/webapp,destination=/usr/share/nginx/html nginx
2, 数据卷容器
如果需要在多个容器间共享一些持续更新的数据,最简单的方式是使用数据卷容器,但是他的目的是专门提供数据卷给其他容器进行挂在
① 创建一个数据容器dba, 并在其中创建一个数据卷挂载到/dba
docker run -it -v /dba --name dba ubuntu
例如:
docker run -it -v /Users/jack_zhou/docker_data_volume --name dba ubuntu
② 在其他容器中使用--volumes-from挂在dba容器中的数据卷
创建db1和db2两个容器,并从dba容器挂在数据卷
docker run -it --volumes-from dba --name dba1 ubuntu
docker run -it --volumes-from dba --name dba2 ubuntu
此时容器db1和容器db2都挂在同一个数据卷到相同的目录,三个容器任何一方在该目录写入,其他容器都能看到。
当然可以多次使用--volumes-from参数从多个容器挂在多个数据卷,还可以从其他已经挂载了容器卷的容器来挂载数据卷。
docker run -d --name db3 --volumes-from db1 training/postgres
注意: 使用--volume-from参数所挂载的数据卷的容器不一定需要在运行。
当然,即使删除挂载的容器,也不会丢失数据卷。除非显式指定docker rm -v
五, 端口映射与容器互联
Docker除了通过网络访问,还提供了两种方便的功能来满足访问的基本需求:
- 允许映射容器内应用的服务端口到本地宿主主机
- 互联机制实现多个容器通过容器名来快速访问
1, 端口映射实现容器访问
① 从外部访问容器应用
在启动容器的时候,如果不指定对应参数,在容器外是无法通过网络来访问容器内的网络应用和服务的。
当容器中运行一些网络应用,要让外部访问这些应用时,可以通过-P或-p参数来指定端口映射。当使用-P标记时,Docker会随机映射一个49000~49900的端口到内部容器开放的网络端口:
docker run -d -P training/webapp python app.py
docker ps -l
此时,可以使用docker ps看到,本地主机的49155被映射到了容器的5000端口。访问宿主主机的49155端口即可访问容器内web应用提供的界面。
② 映射所有接口地址
使用HostPort:ContainerPort格式本地的5000端口映射到容器的5000端口,即可执行命令如下:
docker run -d -p 5000:5000 training/webapp python app.py
此时默认会绑定本地所有接口上的所有地址。多次使用-p标记可以绑定多个端口。例如:
docker run -d -p 5000:5000 -p 3000:80 training/webapp python app.py
③ 映射到指定地址的指定端口
可以使用IP:HostPort:ContainerPort 格式指定映射使用一个特定地址,比如:localhost地址为127.0.0.1:
docker run -d -p 127.0.0.1:5000 training/webapp python app.py
④ 映射到指定地址的任意端口
使用IP::ContainerPort绑定loaclhost的任意端口到容器的5000端口,本地主机会自动分配一个端口
docker run -d -p 127.0.0.1::5000 training/webapp python app.py
还可以使用udp标记来指定udp端口:
docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py
⑤ 查看映射端口配置
使用docker port查看当前映射的端口配置,也可以查看到绑定的地址:
docker port nostalgic 5000
当容器有自己的内部网络和IP地址,使用docker [container] inspect + 容器ID可以获取具体信息。
2, 互联机制实现便捷访问
容器的互联是一种让多个容器中的应用进行快速交互的方式。他会在源和接收容器之间创建连接关系,接收容器可以通过容器名快速访问到源容器,而不用指定具体的IP地址。
① 自定义容器命名
docker run -d -P --name web tarining/webapp python app.py
注意:
容器名称是唯一的,如果已经命名了一个web的容器,再次命名web的容器,需要先使用docker rm 删除之前的同名容器。
② 容器互联
使用--link参数
创建新的容器db
docker run -d --name db training/postgres
删除之前的web容器
docker rm -f web
创建一个新的web容器,并连接到db容器
docker run -d -P --name web --link db:my_db training/webapp python app.py
此时,db容器和web容器建立互联关系
--link 格式为--link name:alias,其中name是容器名称,alias是自己起的别名