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