2. Docker core

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启动.

启动方式

  1. 基于镜像新建容器并启动
  2. 将终止状态(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.

相关推荐
深栈解码43 分钟前
JMM深度解析(三) volatile实现机制详解
java·后端
张家宝68371 小时前
ambari
后端
StephenCurryFans1 小时前
Spring AI vs LangChain4j:Java AI开发框架完整对比指南 🚀
后端·spring
程序员辉哥1 小时前
学会在Cursor中使用Rules生成代码后可以躺平了吗?
前端·后端
Brookty1 小时前
【MySQL】JDBC编程
java·数据库·后端·学习·mysql·jdbc
_代号0071 小时前
MySQL梳理一:整体架构概览
后端·mysql
前端付豪1 小时前
11、打造自己的 CLI 工具:从命令行到桌面效率神器
后端·python
前端付豪1 小时前
12、用类写出更可控、更易扩展的爬虫框架🕷
后端·python
今夜星辉灿烂1 小时前
nestjs微服务-系列2
javascript·后端
世界哪有真情2 小时前
用虚拟IP扩容端口池:解决高并发WebSocket端口耗尽问题
前端·后端·websocket