DOCKER
Docker介绍
摘自Wiki
Docker 是一个开放源代码软件,是一个开放平台,用于开发应用、交付(shipping)应用、运行应用。 Docker允许用户将基础设施(Infrastructure)中的应用单独分割出来,形成更小的颗粒(容器),从而提高交付软件的速度。
Docker容器与虚拟机类似,但二者在原理上不同。容器是将操作系统层虚拟化,虚拟机则是虚拟化硬件,因此容器更具有便携性、高效地利用服务器。 容器更多的用于表示 软件的一个标准化单元。由于容器的标准化,因此它可以无视基础设施(Infrastructure)的差异,部署到任何一个地方。另外,Docker也为容器提供更强的业界的隔离兼容。
Docker三要素:仓库(Registry),镜像(image),容器(container)。
Docker仓库
仓库(repository)是集中存放镜像文件的场所,目前 Docker 官方维护了一个公共仓库 Docker Hub。大部分需求都可以通过在 Docker Hub 中直接下载镜像来实现。如果需要搭建私人仓库,也可以自行搜索搭建方式。
Docker镜像
镜像可以理解为一个安装包,是用于创建容器的基石。
Docker容器
容器可以理解为安装包安装之后的软件。
在我们对容器(一个linux系统)进行更改之后(安装mysql),可以将我们将现有的系统重新打包成安装包(镜像)。下一次我们基于这个新镜像创建容器时,mysql也被配置成功了。
对于这三要素的专业解释请参考:https://docs.docker.com/get-started/overview/
镜像操作
镜像搜索:
以Centos系统镜像为例:
docker search centos :在仓库中查询需要的镜像
--filter “is-official=true|false” : 可以过滤官方镜像和非官方镜像
[root@localhost ~]# docker search centos
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
centos The official build of CentOS. 6318 [OK]
ansible/centos7-ansible Ansible on Centos7 132 [OK]
consol/centos-xfce-vnc Centos container with "headless" VNC session… 123 [OK]
jdeathe/centos-ssh OpenSSH / Supervisor / EPEL/IUS/SCL Repos - … 116 [OK]
镜像拉取:
docker image pull <repository>:<tag> :
[root@localhost ~]# docker pull centos
Using default tag: latest
latest: Pulling from library/centos
7a0437f04f83: Pull complete
Digest: sha256:5528e8b1b1719d34604c87e11dcd1c0a20bedf46e83b5632cdeac91b8c04efc1
Status: Downloaded newer image for centos:latest
docker.io/library/centos:latest
查看本地镜像:
docker images
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos latest 300e315adb2f 31 hours ago 209MB
oracle/database 12.2.0.1-ee be6e5464fe21 2 weeks ago 6GB
oracle/database 19.3.0-ee 06dfbbc1700a 3 weeks ago 6.53GB
镜像导入导出:
docker 镜像导入导出有两种方法:
一种是使用 save 和 load 命令
使用例子如下:
docker save centos:latest -o centos.tar
docker load -i centos.tar
一种是使用 export 和 import 命令将容器导入导出成镜像
使用例子如下:
docker export saim_tes -o centos.tar
docker import centos.tar
解决导入镜像repository和tag为none问题:
docker tag IMAGEID TARGET_IMAGE[:TAG]
需要注意的是:
export 和 import 导出的是一个容器的快照, 不是镜像本身, 也就是说没有 layer。
dockerfile 里的 workdir, entrypoint 之类的所有东西都会丢失,commit 过的话也会丢失。
快照文件将丢弃所有的历史记录和元数据信息(即仅保存容器当时的快照状态),而镜像存储文件将保存完整记录,体积也更大。
docker save 保存的是镜像(image),docker export 保存的是容器(container);
docker load 用来载入镜像包,docker import 用来载入容器包,但两者都会恢复为镜像;
docker load 不能对载入的镜像重命名,而 docker import 可以为镜像指定新名称
容器操作
创建容器:
docker run [OPTIONS] IMAGE [COMMAND] [ARG…]
-i: 以交互模式运行容器,通常与 -t 同时使用;
-t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
-P: 随机端口映射,容器内部端口随机映射到主机的端口
-p: 指定端口映射,格式为:主机(宿主)端口:容器端口
-d: 后台运行容器,并返回容器ID;
[root@localhost ~]# docker run -it --name=saim_tes centos:latest /bin/bash
[root@b9779a8b58a7 /]#
查看本地容器:
这里可以看到b9779a8b58a7 为容器的id,可以通过docker ps -a 查看所有容器
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b9779a8b58a7 centos:latest "/bin/bash" About a minute ago Up About a minute saim_tes
13ca19d9e505 f1cb7c7d58b7 "/bin/bash" About an hour ago Up 32 minutes 0.0.0.0:8002->8002/tcp, 0.0.0.0:8010->8010/tcp, 0.0.0.0:9088->9088/tcp saim
6ec9c3e69d28 centos:7.6.1810 "/bin/bash" 4 hours ago Exited (0) 4 hours ago kind_villani
saim_tes就是我们刚刚创建的容器。
退出容器:
[root@b9779a8b58a7 /]# exit
exit
[root@localhost ~]#
开启和关闭容器:
[root@localhost ~]# docker stop saim_tes
saim_tes
[root@localhost ~]# docker start saim_tes
saim_tes
[root@localhost ~]#
进入容器:
docker exec [OPTIONS] CONTAINER COMMAND [ARG…]
[root@localhost ~]# docker exec -it saim_tes /bin/bash
[root@b9779a8b58a7 /]#
将容器创建新镜像:
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
-a :提交的镜像作者;
-c :使用Dockerfile指令来创建镜像;
-m :提交时的说明文字;
-p :在commit时,将容器暂停。