Docker core
Three core concepts
- 镜像 Image
- 仓库 Repository
- 容器 Container
install and setting.
对于Centos 7系统,有CentoOS-Extras 源中已内置Docker,可直接使用yum 命令安装: -y 表示全自动安装,不需要确认.
csharp
[root@localhost ~]# yum install -y docker
当拉取镜像时,docker报错Get https://registry-1.docker.io/v2/: x509: certificate has expired or is not yet valid.
使用ntpdate
完成时间同步:
sql
yum install -y ntpdate
systemctl start docker -- 启动docker
镜像 Image
Docker 镜像(Image)类似于虚拟机的镜像,可以将它理解为一个面向Docker引擎的只读模板,包含了系统文件。 例如:一个镜像可以只包含一个完整的Ubuntu操作系统环境,可以把它称为一个Ubuntu镜像。
镜像是创建Docker容器的基础。通过版本管理和增量的文件系统,Docker提供了一套十分简单的机制来创建和更新现有的镜像。
csharp
// 获取镜像
[root@localhost ~]# docker pull mysql
// 搜寻镜像
[root@localhost ~]# docker search mysql
// 查看本地镜像
[root@localhost ~]# docker images
创建镜像
基于已有镜像的容器创建
docker commit
命令,其命令格式为 docker commit [OPTIONS] CONTAINER [REPOSITORY [:TAG]],主要选项包括:
ini
-a,--author="" 作者信息
-m,--message="" 提交信息
-p,--pause=true 提交时暂停容器运行
如何使用该命令创建一个新镜像。首先启动一个镜像,并在其中修改操作,例如创建一个test文件,之后退出.
ruby
[root@localhost ~]# docker run -ti ubuntu:latest /bin/bash
root@e140834979a8:/# touch test
root@e140834979a8:/# exit
记住容器的id为e140834979a8。
此时该容器跟ubuntu:latest镜像相比,已经发生了改变,可以使用docker commit 命令来提交作为一个新的镜像。提交时可以指定ID或名称来指定容器。
sql
[root@localhost ~]# docker commit -m "Added a new file" -a "Docker author" e140834979a8 test
sha256:bdcce4bd746aa067e718293f0861c004159e5eb11ab735e60a196bdff1fbe73a
顺利的话,命令会返回新创建的镜像的ID 信息,例如:
sha256:bdcce4bd746aa067e718293f0861c004159e5eb11ab735e60a196bdff1fbe73a
使用 docker images
查看新的镜像.
基于本地模板导入
也可以直接从一个操作系统模板文件导入一个镜像。 比如:下载一个ubuntu-14.04-x86_64-minimal.tar.gz的模板压缩包,可以使用一下命令导入:
csharp
[root@localhost ~]# cat ubuntu-14.04-x86_64-minimal.tar.gz | docker import - ubuntu:14.04
使用 docker images
查看新的镜像.
基于Dockerfile创建
image 的增删改查
删除
使用docker rmi
命令k可以删除镜像,命令格式为docker rmi IMAGE [IMAGE...],其中IMAGE可以为标签或ID。
sql
[root@localhost ~]# docker rmi qiuhaijun/user/test
Untagged: qiuhaijun/user/test:latest
Untagged: qiuhaijun/test@sha256:151faaca6662a136f8ee51ffdc59cf6f68461586391ca2c1d97fbcca814df5ef
本地的 test:latest镜像不会受影响,当同一个镜像拥有多个标签的时候,docker rmi 命令只是删除了该镜像多个标签中指定标签而已,并不影响镜像。
为了保险起见,再次查看本地的镜像,发现test:latest镜像(准确的说,是 3540497c2b9d进行)任然存在:
bash
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
test latest bdcce4bd746a 22 minutes ago 64.2 MB
qiuhaijun/test latest 3540497c2b9d About an hour ago 64.2 MB
user/test latest 3540497c2b9d About an hour ago 64.2 MB
docker.io/ubuntu latest 72300a873c2c 2 days ago 64.2 MB
docker.io/mysql latest afaec1334369 3 days ago 471 MB
warning
警告! 当镜像只有一个标签时,使用 docker rmi 命令会彻底删除该镜像。
使用镜像ID删除
docker rmi imageID
, 镜像创建的容器运行时,镜像文件m默认是无法被删除的。
csharp
[root@localhost ~]# docker run ubuntu echo 'hello! I am here!'
hello! I am here!
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
99977909f7fc ubuntu "echo 'hello! I am..." 17 seconds ago Exited (0) 15 seconds ago dazzling_darwin
[root@localhost ~]# docker rmi ubuntu
Error response from daemon: conflict: unable to remove repository reference "ubuntu" (must force) - container 99977909f7fc is using its referenced image 72300a873c2c
使用 docker ps -a
可以查看本机上存在的所有容器.
强制删除镜像,可以使用 -f
参数:docker rim -f ubuntu
, 使用 -f
参数来强制删除一个存在容器依赖的镜像,会有一些遗留问题。
正确的做法是先删除该镜像依赖的所有容器,再来删除镜像。首先删除容器ID 99977909f7fc
docker rm 999
在使用临时的ID来删除镜像,此时会正常打印删除的各层信息:
makefile
[root@localhost ~]# docker rmi 72300a873c2c
Untagged: docker.io/ubuntu:latest
Untagged: docker.io/ubuntu@sha256:04d48df82c938587820d7b6006f5071dbbffceb7ca01d2814f81857c631d44df
Deleted: sha256:72300a873c2ca11c70d0c8642177ce76ff69ae04d61a5813ef58d40ff66e3e7c
Deleted: sha256:d3991ad41f89923dac46b632e2b9869067e94fcdffa3ef56cd2d35b26dd9bce7
Deleted: sha256:2e533c5c9cc8936671e2012d79fc6ec6a3c8ed432aa81164289056c71ed5f539
Deleted: sha256:282c79e973cf51d330b99d2a90e6d25863388f66b1433ae5163ded929ea7e64b
Deleted: sha256:cc4590d6a7187ce8879dd8ea931ffaa18bc52a1c1df702c9d538b2f0c927709d
存出镜像
lua
docker save -o cnetos.tar centos:latest
本地文件载入镜像到本地镜像库
docker load > centos.tar
或者
dcoker load --input centos.tar
上传镜像
输入docker login docker.io
登陆默认的Docker Hub
仓库,输入账户密码即可。
本地镜像名增加帐号信息 docker push qiuhaijun/test, 貌似不能 qiuhaijun/test/test 多层级,这种情况使用 tag
来获取分支 docker tag qiuhaijun/test/test qiuhaijun/test
vbnet
[root@localhost ~]# docker login docker.io
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: qiuhaijun
Password:
Login Succeeded
[root@localhost ~]# docker push qiuhaijun/test
The push refers to a repository [docker.io/qiuhaijun/test]
616272434a7f: Pushed
1852b2300972: Pushed
03c9b9f537a4: Pushed
8c98131d2d1d: Pushed
cc4590d6a718: Pushed
latest: digest: sha256:151faaca6662a136f8ee51ffdc59cf6f68461586391ca2c1d97fbcca814df5ef size: 1359
容器 Container
Docker 容器(Container)类似于一个轻量级的沙箱,Docker 利用容器来运行和隔离应用。
容器是从镜像创建的应用运行实例,可以将其启动、开始、停止、删除,而这些容器都是相互隔离、互不相见的。
docker的容器十分轻量级,用户可随时创建或删除
创建容器
csharp
# -t 让docker分配一个伪终端,-i 让容器的标准输入保持打开
[root@localhost ~]# docker create -it centos:latest
[root@localhost ~]# docker ps -a
docker create
新建的容器处于停止状态,可使用docker start
启动.
启动方式
- 基于镜像新建容器并启动
- 将终止状态(stopped)的容器重新启动
主要命令为 docker run
,等价于docker create
命令,在执行 docker start
命令.
终止容器 (Stopped)
exit 或 ctrl + d 退出容器
csharp
[root@localhost ~]# docker stop b8e 终止容器,先发送sigkill信号,默认10ms再发送sigkill终止容器
[root@localhost ~]# docker kill b8e 发送终止信号强行终止容器
查看终止状态的容器ID
css
[root@localhost ~]# docker ps -a -q
终止状态的容器,通过docker start ce5 重启,此外,docker restart 命令会将一个运行态的容器终止,然后在启动它
守护态运行(Daemonized)
后台运行程序:-d 参数来实现:
docker run -d centos /bin/sh -c "while true;do echo hello world;sleep 1;done"
查看容器信息
docker ps
获取容器输出的信息
docker logs ce5 (Container id 的前三个字符)
进入容器
在使用-d参数时,容器会进入后台,无法看到容器信息。使用如下命令可进入容器操作
csharp
[root@localhost ~]# docker attach vigorous_moser
[root@localhost ~]# docker exec -ti bd5a07b5a489 /bin/bash
删除容器
运行中的容器使用 -f 参数删除
csharp
[root@localhost ~]# docker rm -f cb44d66b373f
导出容器
csharp
[root@localhost ~]# docker export e95 > test_for_run.tar
导入容器
导出的文件可以使用 docker import 导入,成为镜像
bash
[root@localhost ~]# cat test_for_run.tar | docker import - test/for_run:v1.0
sha256:02975985a20a867cd877a7a4dfca7a7a36b2162b6c8abf6dd81103226b2a8c7c
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
test/for_run v1.0 02975985a20a 2 minutes ago
之前使用过docker load 导入镜像文件。
实际上既可以使用 dokcer load命令来导入镜像存储文件到本地的镜像库,又可使用docker import 命令来导入一个容器快照到本地镜像库。 这两者的区别在于容器快照文件将丢弃所有文件的历史纪录和元数据信(即仅保存容器当时的快照状态),而镜像存储文件将保存完整记录,体积也要大。此外,从容器快照文件导入时可以重新指定标签等元数据信息.
仓库 Repository
Docker 仓库类似于代码仓库,是Docker集中存放镜像文件的场所。
注册服务器(Registry) 是存放仓库地方。
Docker 仓库分为公开仓库(Public) 私有仓库 (Private)
Docker Hub
hub.docker.com 是docker官方维护的公共仓库,包括 15000 多个的镜像。大部分需求都可以通过Docker Hub直接下载来实现。
登陆
docker login
命令来实现用户名/密码的输入来完成登陆。注册成功后,本地用户目录的.dockercfg 中将保存用户的认证信息。
基本操作
docker search
命令查找仓库中的镜像,并利用 docker pull
命令下载到本地。
push 推送镜像
pull 拉取镜像
Docker 利用仓库管理镜像的设计理念类似于Git.