docker架构之容器、镜像、仓库

简单理解:从仓库下载镜像,运行镜像生成容器,在容器中独立运行程序,不会影响本地主机。

1.Docker基本架构

  • 镜像(Image):Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。
  • 容器(Container):镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
  • 仓库(Repository):仓库可看成一个代码控制中心,用来保存镜像。

注:在终端直接输入docker可查看Docker客户端的所有命令选项,使用docker command --help 可以查看具体命令的使用方法。

2.设置docker仓库

1)设置远程仓库

使用默认的官方仓库可能会卡,所以我们设置国内的仓库进行加速

修改/etc/docker/daemon.json文件,如果没有可以手动创建,内容为:

{
  "registry-mirrors":[
    "https://abcdefg.mirror.aliyuncs.com",
    "https://docker.mirrors.ustc.edu.cn",
    "https://registry.docker-cn.com"
  ]
}
注:阿里云的那个是个人单独的镜像加速器,登陆阿里云--控制台--容器镜像服务--镜像加速器,查看。

重启docker服务:

systemctl restart docker

查看是否生效

docker info

2)设置本地仓库

下载registry镜像

docker  pull  registry

查看镜像

docker images
REPOSITORY    TAG       IMAGE ID       CREATED        SIZE
hello-world   latest    d1165f221234   6 days ago     13.3kB
registry      latest    678dfa38fcfa   2 months ago   26.2MB

创建存储本地镜像的目录

mkdir /cluster/localregistry

启动registry镜像

docker run -d -p 5000:5000 --name=localregistry --restart=always --privileged=true -v /cluster/localregistry:/var/lib/registry registry

注解:

-d 后台运行

-p 端口映射

--name 容器名称

--restart=always 自动重启

--privilege=true centos7中的安全模块selinux把权限禁止了,加上这行是给容器增加执行权限

-v 把物理机的/cluster/localregistry目录挂载到容器中的/var/lib/registry目录下,假如容器被删除,可以保证镜像不被删除

查看

docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f1446545e319 registry "/entrypoint.sh /etc…" 31 minutes ago Up 4 minutes 0.0.0.0:5000->5000/tcp localregistry

配置http权限支持

vim /etc/docker/daemon.json
{
"insecure-registries":["192.168.1.199:5000"]
}

重启docker服务和registry容器

systemctl restart docker
docker restart localregistry

将原来下载的hello-world镜像标记为192.168.1.199:5000/test

docker tag hello-world 192.168.1.199:5000/test

推送到本地仓库

docker push 192.168.1.199:5000/test

此时可查看到test目录

/cluster/localregistry/docker/registry/v2/repositories/test/

查看刚才上传的镜像

curl http://192.168.1.199:5000/v2/_catalog
{"repositories":["test"]}

删除原有的镜像

docker rmi 192.168.1.199:5000/test
docker rmi hello-world
docker imgag

从本地拉取刚才创建的镜像

docker pull 192.168.1.199:5000/test
docker images

3.Docker镜像

 1)镜像存放目录

默认情况下,docker相关数据存放在/var/lib/docker/下

 2)更改存放目录

暂无。

3)列出本地镜像列表

# docker images
REPOSITORY    TAG       IMAGE ID       CREATED         SIZE
registry     latest    678dfa38fcfa   3 months ago    26.2MB
hello-world     latest    bf756fb1ae65   14 months ago   13.3

4)搜索镜像

# docker search ubuntu
NAME              DESCRIPTION                    STARS     OFFICIAL   AUTOMATED
ubuntu             Ubuntu is a Debian-based Linux operating sys…   11979     [OK]

5)下载镜像

# docker pull ubuntu

# docker pull ubuntu:18.10  (指定版本下载)

6)运行镜像

# docker run -t -i ubuntu:18.10 /bin/bash
root@683a0787e0fe:/#

-t 创建新的终端   -i 交互式操作   /bin/bash 指定交互式shell

7)删除镜像

# docker rmi ubuntu:18.10

8)设置镜像标签

# docker tag 678dfa38fcfa newImageName:tagName

4.Docker容器

1)启动容器

当运行一个镜像的时候,便是开启了一个容器

# docker run -itd ubuntu /bin/bash

-d 是后台运行

2)查看容器

# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
683a0787e0fe ubuntu:18.10 "/bin/bash" 22 hours ago Exited (0) 22 hours ago trusting_greider
f1446545e319 registry "/entrypoint.sh /etc…" 13 days ago Up 10 minutes 0.0.0.0:5000->5000/tcp localregistr

3)启动一个停止的容器

# docker start 683a0787e0fe
683a0787e0fe

4)停止一个容器

# docker stop 683a0787e0fe

5)进入容器

已上面的ubuntu为例:

# docker exec-it 683a0787e0fe /bin/bash

注:也可以用docker attach,但退出时会终止容器,exec则不会。

6)导出和导入容器

   导出容器为容器快照文件:

# docker export 683a0787e0fe > ubuntu.tar

   导入容器快照文件到镜像:

# cat ubuntu.tar | docker import - test/ubuntu:v1
sha256:bb83b07f0f72e2edf60b92d98e7ee6329fbaa6c8e354fb00a29cb08367f8a64f
# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
test/ubuntu v1 bb83b07f0f72 7 seconds ago 67.3M

   直接从容器创建一个新的镜像

# docker ps
CONTAINER ID   IMAGE     COMMAND       CREATED      STATUS         PORTS     NAMES
ec8276fc6743   ubuntu    "/bin/bash"   4 days ago   Up 2 seconds             test
# docker commit -a "pmgame" -m "TTT" ec8276fc6743 newtest:v2
sha256:9aeee961850ac911fea3004ec0b530455ce82048cd24ca5c8cc4fe6d87a794be
# docker images
REPOSITORY            TAG       IMAGE ID       CREATED         SIZE
newtest               v2        9aeee961850a   6 seconds ago   195MB

   -a :提交的镜像作者        -c :使用Dockerfile指令来创建镜像

   -m :提交时的说明文字        -p :在commit时,将容器暂停

7)删除容器

# docker rm -f 683a0787e0fe

清理所有处于终止状态的容器:

# docker container prune
WARNING! This will remove all stopped containers.
Are you sure you want to continue? [y/N] y
Deleted Containers:
683a0787e0fec6a3fd2e700694493843575f76b128dd48909e34c417eb630c05
f1446545e3199bc17344d3fc20e3b146f438cfed47f0f22495fc7b88e9e4e41c

Total reclaimed space: 64B

8)使用容器运行web应用

   8.1)载入镜像

# docker pull training/webapp

   8.2)启动容器

# docker run -d -P training/webapp python app.py
711bdfb2340eb8ad75cdbbe312cafb172fc47ec3e88dccd1dd835ad95af9adc1
注:-P
将容器内部使用的网络端口随机映射到我们使用的主机上。

   8.3)查看容器

# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
711bdfb2340e training/webapp "python app.py" 46 seconds ago Up 45 seconds 0.0.0.0:49153->5000/tcp keen_davinc

   查看发现,Docker开放了 5000 端口(默认 Python Flask 端口)映射到主机端口49153上。

   

   也可以指定端口(将Docker的5000端口映射到本地3344端口):

# docker run -d -p 3344:5000 training/webapp python app.py

   8.4)检查容器端口映射:

# docker port 711bdfb2340e 
5000/tcp -> 0.0.0.0:3344

   8.5)查看web应用程序日志

# docker logs -f 591194e8bb9d
 * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
192.168.1.65 - - [25/Mar/2021 06:47:54] "GET / HTTP/1.1" 200 -
192.168.1.65 - - [25/Mar/2021 06:47:55] "GET /favicon.ico HTTP/1.1" 404 -

    8.6)查看底层信息

   该命令会返回一个JSON 文件记录着 Docker 容器的配置和状态信息。

# docker inspect 591194e8bb9d
原文地址:https://www.cnblogs.com/1016391912pm/p/14519429.html