容器
容器就是一个视图隔离、资源可限制、独立文件系统的进程集合。所谓“视图隔离”就是能够看到部分进程以及具有独立的主机名等;控制资源使用率则是可以对于内存大小以及 CPU 使用个数等进行限制。容器就是一个进程集合,它将系统的其他资源隔离开来,具有自己独立的资源视图。
docker简介
- Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。
- Docker 属于 Linux 容器的一种封装,提供简单易用的容器使用接口。它是目前最流行的 Linux 容器解决方案。
- Docker 使用客户端-服务器 (C/S) 架构模式:
Docker 命令行工具,是用户使用Docker的主要方式,Docker client与Docker daemon通信并将结果返回给用户,Docker client也可以通过socket或者RESTful api访问远程的Docker daemon- LXC (Linux Container)容器是一种内核虚拟化技术,可以提供轻量级的虚拟化,以便隔离进程和资源。
- docker底层语言为go语言
相关网站
Docker官网:https://www.docker.com/
Docker hub :https://hub.docker.com/
docker 与传统虚拟化方式优缺点比较---优点
特性 | Docker | 传统虚拟化技术(KVM) |
---|---|---|
启动速度 | 非常快(秒级) | 慢(分钟级) |
磁盘使用(模板文件) | 小(MB) | 大(GB) |
性能 | 一般于宿主机 | 比宿主机弱 |
单机系统支持量 | 大(千计) | 小(十计) |
管理及应用 | 更轻松的迁移和扩展 |
docker 与传统虚拟化方式优缺点比较---局限
- Docker是基于Linux 64bit的,无法在32bit的linux/Windows/unix环境下使用
- LXC(Linux Container)是基于cgroup等linux kernel功能的,因此container的guest系统(Guest是指让给客人访问电脑系统的帐户)只能是linux base的
- 隔离性相比KVM之类的虚拟化方案还是有些欠缺,所有container公用一部分的运行库
- 网络管理相对简单,主要是基于namespace隔离
- cgroup的cpu和cpuset提供的cpu功能相比KVM的等虚拟化方案相比难以度量(所以dotcloud主要是按内存收费)
- Docker对disk的管理比较有限
- container随着用户进程的停止而销毁,container中的log等用户数据不便收集
- Docker 隔离性没有传统虚拟化好,KVM等属于完全隔离
摘自:https://baike.baidu.com/item/Docker/13344470?fr=aladdin#1_4
Docker三核心
Docker Image(镜像)
- 文件的层次结构,以及包含如何运行容器的元数据, Dockerfile中的每条命令都会在文件系统中创建一个新的层次结构,文件系统在这些层次上构建起来,镜像就构建于这些联合的文件系统之上。
- Docker 镜像就是一个只读的模板,镜像可以用来创建 Docker 容器。Docker 提供了一个很简单的机制来创建镜像或者更新现有的镜像,用户甚至可以直接从其他人那里下载一个已经做好的镜像来直接实现。
Docker Container(容器)
- 容器是从镜像创建的运行实例。它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。可以把容器看做是一个简易版的 Linux 环境,Docker 利用容器来运行应用。
Docker Hub/Registry(仓库)
- 仓库是集中存放镜像文件的场所,仓库注册服务器(Registry)上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag)。
- 仓库分为public registry和private registry
- 目前,最大的公开仓库是 Docker Hub(docker公司运营),存放了数量庞大的镜像供用户下载。
- Docker仓库用来保存我们的images,当我们创建了自己的image之后我们就可以使用push命令将它上传到公有或者私有仓库,这样下次要在另外一台机器上使用这个image时候,只需要从仓库上pull下来即可。
Docker 的底层实现
cgroup
- cgroup (Control Group)Linux 操作系统通过 cgroup 可以设置进程使用 CPU、内存 和 IO 资源的限额。
在 /sys/fs/cgroup/memory/docker 目录中,Linux 会为每个容器创建一个 cgroup 目录,以容器长ID 命名:
╭─root@du-z ~
╰─➤ ls /sys/fs/cgroup/memory/docker/196ddbdaa07a5ebdc33cd78a6a575a13cc9319bfe46ed537872b9b960ea4e86b
cgroup.clone_children memory.memsw.failcnt
cgroup.event_control memory.memsw.limit_in_bytes
cgroup.procs memory.memsw.max_usage_in_bytes
memory.failcnt memory.memsw.usage_in_bytes
memory.force_empty memory.move_charge_at_immigrate
memory.kmem.failcnt memory.numa_stat
memory.kmem.limit_in_bytes memory.oom_control
memory.kmem.max_usage_in_bytes memory.pressure_level
memory.kmem.slabinfo memory.soft_limit_in_bytes
memory.kmem.tcp.failcnt memory.stat
memory.kmem.tcp.limit_in_bytes memory.swappiness
memory.kmem.tcp.max_usage_in_bytes memory.usage_in_bytes
memory.kmem.tcp.usage_in_bytes memory.use_hierarchy
memory.kmem.usage_in_bytes notify_on_release
memory.limit_in_bytes tasks
memory.max_usage_in_bytes
namespace
- linux 内核从Linux 2.4.19 版本开始引入namespace的概念。其目的是作系统资源隔离,通过特定的方法使得namespace中的进程看起来拥有自己的全局系统资源(global system resource)。
linux内核中共实现的六种隔离:
- mount namespaces :Linux 2.4.19版本内核引入;主要用于隔离文件系统挂载点;使每个容器看上去都有整个文件系统
- UTS namespaces : LInux 2.6.19版本内核引入;主要用于隔离nodename和domainname两个系统标识;使每个容器都有自己的hostname和domainname
- IPC namespaces :Linux 2.6.19版本内核引入;主要用于隔离信号量,消息队列,共享内存;使只有在同一个IPC namespace 的进程之间才能互相通信; IPC(Inter-Process Communication,进程间通信)
- PID namespaces :Linux2.6.24版本内核引入;主要用于隔离进程ID;使每个PID namespace 中的进程可以有其独立的PID,每个容器可以有PID为1的root进程;同一进程在不同PID namespace中有不同的PID;容器中每个进程都有两PID 容器中的PID和宿主机中的PID
- Network namespaces:Linux2.6.29版本内核引入;主要用于隔离系统网络资源;使每个容器都有其独立的网络设备,IP地址,端口号,IP路由表等
- User namespaces :Linux3.8版本内核引入;主要用于隔离用户和用户组ID;使每一个进程的User ID 和Group ID 在User namespace 内外可以是不同的;使得每一个进程在User namespace里面有root权限,但是在User namespace外面却没有root的权限
Docker 部署安装
docker-ce | 社区免费版 |
---|---|
docker-ee | 企业收费版 |
第一步:注册阿里云账号并在阿里云“容器镜像服务”中获得加速
第二步:下载阿里云网站新版docker-ce
具体操作:
# vim docker-sbeed.sh
...
#!/bin/bash
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
mv docker-ce.repo /etc/yum.repos.d
yum install docker-ce -y
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://xxxxx.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
...
# bash docker-sbeed.sh
Docker简单操作
image相关操作
╭─root@localhost.localdomain ~
╰─➤ docker image help
Usage: docker image COMMAND
Manage images
Commands:
build Build an image from a Dockerfile
#从dockerfile中创建镜像
history Show the history of an image
#可以显示镜像的构建历史 ;docker镜像分层构建,每一层都有一个指令
import Import the contents from a tarball to create a filesystem image
#从一个压缩包创建镜像
inspect Display detailed information on one or more images
#显示一个或多个image的详细信息
load Load an image from a tar archive or STDIN
#从tar包或STDIN加载image
ls List images
#列出images
prune Remove unused images
#删除未使用的images
pull Pull an image or a repository from a registry
#从registry(仓库)中拉取镜像
push Push an image or a repository to a registry
#推送镜像到registry(仓库)中
rm Remove one or more images
#删除一个或多个镜像
save Save one or more images to a tar archive (streamed to STDOUT by default)
#创建镜像压缩包
tag Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE
#改名image(原名文件保留)
实例1:拉取image(pull)
╭─root@localhost.localdomain ~
╰─➤ docker image pull busybox
# docker image pull --help
Usage: docker image pull [OPTIONS] NAME[:TAG|@DIGEST]
##注意:如果在拉取镜像的时候只指定了REPOSITORY的话,默认拉取的是tag为latest的版本
实例2:查看当前有哪些镜像 (ls)
╭─root@localhost.localdomain ~
╰─➤ docker image list
REPOSITORY TAG IMAGE ID CREATED SIZE
busybox latest db8ee88ad75f 3 weeks ago 1.22MB
实例3: 查看镜像构建历史 (history)
╭─root@localhost.localdomain ~
╰─➤ docker image history busybox:latest
IMAGE CREATED CREATED BY SIZE COMMENT
db8ee88ad75f 3 weeks ago /bin/sh -c #(nop) CMD ["sh"] 0B
<missing> 3 weeks ago /bin/sh -c #(nop) ADD file:9ceca008111a4ddff… 1.22MB
实例4:制作镜像压缩包 (save)
方法一:使用-o选项,output
╭─root@localhost.localdomain ~
╰─➤ docker image save busybox -o busybox-latest.tar
╭─root@localhost.localdomain ~
╰─➤ ls
anaconda-ks.cfg busybox-latest.tar docker-sbeed.sh
方法二:使用标准输出
╭─root@localhost.localdomain ~
╰─➤ docker image save busybox > busybox-v1.tar
╭─root@localhost.localdomain ~
╰─➤ ls
anaconda-ks.cfg busybox-latest.tar busybox-v1.tar docker-sbeed.sh
实例5:使用镜像压缩包 (load)
方法一:使用-i选项 input
╭─root@localhost.localdomain ~
╰─➤ docker image load -i busybox-latest.tar
Loaded image: busybox:latest
╭─root@localhost.localdomain ~
╰─➤ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
busybox latest db8ee88ad75f 3 weeks ago 1.22MB
方法二:实用标准输入
docker image load < busybox-latest.tar
实例6:删除镜像 (rm)
docker image rm busybox:latest
实例7:镜像改名 (tag)
╭─root@localhost.localdomain ~
╰─➤ docker image tag busybox:latest busybox:v1
╭─root@localhost.localdomain ~
╰─➤ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
busybox latest db8ee88ad75f 3 weeks ago 1.22MB
busybox v1 db8ee88ad75f 3 weeks ago 1.22MB
例子8:清除不经常使用的镜像 (prune)
╭─root@localhost.localdomain ~
╰─➤ docker image prune -f
Total reclaimed space: 0B
Container(容器)操作
╭─root@localhost.localdomain ~
╰─➤ docker container --help
Usage: docker container COMMAND
Manage containers
Commands:
attach Attach local standard input, output, and error streams to a running container
#将本地标准输入、输出和错误输出追加到正在运行的容器中
commit Create a new image from a container's changes
#从容器的更改中创建一个新image
cp Copy files/folders between a container and the local filesystem
#在容器和本地文件系统之间复制文件/文件夹
create Create a new container
#创建一个新容器
diff Inspect changes to files or directories on a container's filesystem
#检查容器文件系统上文件或目录的更改
exec Run a command in a running container
#在正在运行的容器中运行命令(进入容器)
export Export a container's filesystem as a tar archive
#将容器的文件系统导出为tar包
inspect Display detailed information on one or more containers
#在一个或多个容器上显示详细信息
kill Kill one or more running containers
#杀死一个或多个正在运行的容器
logs Fetch the logs of a container
#获取容器的日志
ls List containers
#列出容器(containers)
pause Pause all processes within one or more containers
#暂停一个或多个容器中的所有进程
port List port mappings or a specific mapping for the container
#列出容器的端口映射或特定映射
prune Remove all stopped containers
#移除所有停止的容器
rename Rename a container
#给容器改名
restart Restart one or more containers
#重启一个或多个容器
rm Remove one or more containers
#删除一个或多个容器
run Run a command in a new container
#在新容器中运行命令
start Start one or more stopped containers
#启动一个或多个停止的容器(stopped)
stats Display a live stream of container(s) resource usage statistics
#实时显示容器资源使用统计数据
stop Stop one or more running containers
#停止一个或多个正在运行的容器
top Display the running processes of a container
#显示容器的运行进程
unpause Unpause all processes within one or more containers
#继续运行paused状态的容器
update Update configuration of one or more containers
#更新一个或多个容器的配置
wait Block until one or more containers stop, then print their exit codes
#阻塞,直到一个或多个容器停止,然后打印它们的退出代码
ps #查看正在运行的容器
指定某容器的两种方法:CONTAINER-ID ,CONTAINER-NAME
实例1:运行容器 (run)
-i 交互模式
-t分配终端
╭─root@localhost.localdomain ~
╰─➤ docker container run -it busybox /bin/sh
/ # ls
bin dev etc home proc root sys tmp usr var
/ # exit
-d 后台运行
╭─root@localhost.localdomain ~
╰─➤ docker container run -d nginx-game:v1
--name 指定容器名字
-d 后台运行
--rm 容器停掉之后自动删除
╭─root@localhost.localdomain ~
╰─➤ docker container run --name nginx -d --rm nginx:latest
实例2:查看正在运行的容器 (ps)
╭─root@localhost.localdomain ~
╰─➤ docker container ps
查看所有容器
╭─root@localhost.localdomain ~
╰─➤ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b967cc0a7a67 busybox "sh" 9 hours ago Exited (0) 9 hours ago zealous_shaw
ee42b5eff0cd busybox "sh" 9 hours ago Exited (0) 9 hours ago intelligent_cerf
db206796c1a0 busybox "/bin/sh" 9 hours ago Exited (127) 9 hours ago admiring_northcutt
实例3:删除容器 (rm)
╭─root@localhost.localdomain ~
╰─➤ docker container rm b967cc0a7a67
b967cc0a7a67
批量删除容器
╭─root@localhost.localdomain ~
╰─➤ docker container rm $(docker ps -aq)
ee42b5eff0cd
db206796c1a0
Error response from daemon: You cannot remove a running container bb47bdca3639aaee6ed332a62fa00c7c0d768fa6a1f6a1d1e1864cab2770b622. Stop the container before attempting removal or force remove
# 不会删除正在运行的container
# rm 不能直接删除dead状态的container
强制删除
docker container rm -f b967cc0a7a67
实例4:查看容器信息 (inspect)
╭─root@localhost.localdomain ~
╰─➤ docker inspect db206796c1a0
...#详细信息
实例5:查看容器暴露的端口
方法1: (ps) (注意: 容器需在up运行状态)
╭─root@du-z ~
╰─➤ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
69fdffa4d862 nginx "nginx -g 'daemon of…" 13 seconds ago Up 11 seconds 0.0.0.0:32768->80/tcp frosty_swartz
方法2:(history)
╭─root@localhost.localdomain ~
╰─➤ docker image history e445ab08b2b |grep EXPOSE
<missing> 2 weeks ago /bin/sh -c #(nop) EXPOSE 80 0B
方法3: (inspect)
╭─root@localhost.localdomain ~
╰─➤ docker container inspect bb47bdca3639 |grep Ports -A3
"PublishAllPorts": false,
"ReadonlyRootfs": false,
"SecurityOpt": null,
"UTSMode": "",
--
"ExposedPorts": {
"80/tcp": {}
},
"Tty": false,
--
"Ports": {
"80/tcp": null
},
"SandboxKey": "/var/run/docker/netns/ea04a98cd4ee",
实例6:查看容器运行状态 (stats)
╭─root@localhost.localdomain ~
╰─➤ docker container stats bb47bdca3639
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
bb47bdca3639 nginx 0.00% 1.387MiB / 976.5MiB 0.14% 648B / 0B 5.04MB / 0B 2
实例7:对容器内存使用量进行限制 (run -m)
╭─root@du-z ~
╰─➤ docker run -d --name nginx --rm -m 64M nginx
╭─root@du-z ~
╰─➤ docker stats nginx
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
fdec1b43873d nginx 0.00% 1.383MiB / 64MiB 2.16% 648B / 0B 0B / 0B 2
实例8:容器改名 (rename)
╭─root@du-z ~
╰─➤ docker rename nginx nginx1
╭─root@du-z ~
╰─➤ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
fdec1b43873d nginx "nginx -g 'daemon of…" 2 minutes ago Up 2 minutes 80/tcp nginx1
实例9:停掉容器 (stop)
╭─root@du-z ~
╰─➤ docker stop 2ed61f50ef50
2ed61f50ef50
实例10:杀掉容器 (kill)
╭─root@du-z ~
╰─➤ docker kill 2ed61f50ef50
2ed61f50ef50
kill与stop的区别:
- kill: 强硬退出,直接退出 -9
- stop: 优雅退出 -15 ,给10秒钟退出准备,10秒后 kill -9
实例12:查看容器日志 (logs)
╭─root@du-z ~
╰─➤ docker container logs nginx1
# 持续监听日志
╭─root@du-z ~
╰─➤ docker container logs nginx1 -f
实例13:进入容器 (exec)
╭─root@du-z ~
╰─➤ docker exec -it nginx1 /bin/sh
# ls
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
#
# exit
实例14:查看端口映射(port)
╭─root@du-z ~
╰─➤ docker port b4b75dcb00cc
80/tcp -> 192.168.137.3:32768
Container(容器)端口映射
- 端口映射使容器可以外部访问
第一类:把容器的端口随机映射为物理机的一个端口(-P 大写)
注意:使用-P选项,是把容器内所有expose的端口都映射为物理机的随机端口
╭─root@du-z ~
╰─➤ docker run -d -P nginx
╭─root@du-z ~
╰─➤ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
69fdffa4d862 nginx "nginx -g 'daemon of…" 13 seconds ago Up 11 seconds 0.0.0.0:32768->80/tcp frosty_swartz
╭─root@du-z ~
╰─➤ ss -ntl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 *:22 *:*
LISTEN 0 100 127.0.0.1:25 *:*
LISTEN 0 128 :::22 :::*
LISTEN 0 100 ::1:25 :::*
LISTEN 0 128 :::32768 :::*
第二类:把容器的端口映射为物理机特定的一个端口(-p 小写)
注意:81 为物理机端口 80为容器端口
╭─root@du-z ~
╰─➤ docker run -d -p 81:80 nginx
╭─root@du-z ~
╰─➤ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
fa0c51407f81 nginx "nginx -g 'daemon of…" 52 seconds ago Up 50 seconds 0.0.0.0:81->80/tcp elegant_fermat
╭─root@du-z ~
╰─➤ ss -ntl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 *:22 *:*
LISTEN 0 100 127.0.0.1:25 *:*
LISTEN 0 128 :::81 :::*
LISTEN 0 128 :::22 :::*
LISTEN 0 100 ::1:25 :::*
第三类:把容器的端口映射为物理机特定网卡上的特定端口(-p 小写)
注意:192.168.137.3:81 <--->0.0.0.0:81
╭─root@du-z ~
╰─➤ docker run -d -p 192.168.137.3:81:80 nginx
╭─root@du-z ~
╰─➤ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d4fd0a2b72f9 nginx "nginx -g 'daemon of…" 13 seconds ago Up 11 seconds 192.168.137.3:81->80/tcp laughing_tu
╭─root@du-z ~
╰─➤ ss -ntl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 192.168.137.3:81 *:*
LISTEN 0 128 *:22 *:*
LISTEN 0 100 127.0.0.1:25 *:*
LISTEN 0 128 :::22 :::*
LISTEN 0 100 ::1:25 :::*
第四类:把容器的端口映射为物理机特定网卡上的随机端口(-p 小写)
╭─root@du-z ~
╰─➤ docker run -d -p 192.168.137.3::80 nginx
╭─root@du-z ~
╰─➤ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b4b75dcb00cc nginx "nginx -g 'daemon of…" 5 seconds ago Up 4 seconds 192.168.137.3:32768->80/tcp loving_hellman
╭─root@du-z ~
╰─➤ ss -ntl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 *:22 *:*
LISTEN 0 100 127.0.0.1:25 *:*
LISTEN 0 128 192.168.137.3:32768 *:*
LISTEN 0 128 :::22 :::*
LISTEN 0 100 ::1:25 :::*
两容器之间建立连接
命令参数
$ run --link name:alias
#其中:name一个运行中的容器名;alias 是这个连接的别名
#Docker 在两个互联的容器之间创建了一个安全隧道,而且不用映射它们的端口到宿主主机上
Docker 通过两种方式为容器公开连接信息:
- 环境变量
- 更新 /etc/hosts文件
示例:
#第一步:运行一个mysql容器取名mysqlname
╭─root@du-z ~
╰─➤ docker run -d -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=root --name mysqlname mysql
499490e40651b18d0fd37d4d91268f1c2af0b40c06dfb19b705b7b4ff87cd31c
#第二步:run --link 关联创建nginx容器
╭─root@du-z ~
╰─➤ docker run -d --link mysqlname:mysql nginx
2b90eb01945aae98f476bc23ac0766ab840b96a69b933b5b3bc999da5fc38271
#第三步:进入nginx容器查看环境变量
╭─root@du-z ~
╰─➤ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2b90eb01945a nginx "nginx -g 'daemon of…" About a minute ago Up About a minute 80/tcp awesome_mcclintock
499490e40651 mysql "docker-entrypoint.s…" 8 minutes ago Up 8 minutes 3306/tcp, 33060/tcp mysqlname
╭─root@du-z ~
╰─➤ docker exec -it 2b90eb01945a sh
# env
MYSQL_PORT_33060_TCP=tcp://172.17.0.4:33060
HOSTNAME=2b90eb01945a
HOME=/root
PKG_RELEASE=1~buster
MYSQL_ENV_MYSQL_MAJOR=8.0
TERM=xterm
MYSQL_PORT_3306_TCP_ADDR=172.17.0.4
NGINX_VERSION=1.17.2
MYSQL_ENV_MYSQL_ROOT_PASSWORD=root
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
MYSQL_ENV_GOSU_VERSION=1.7
MYSQL_PORT_3306_TCP_PORT=3306
NJS_VERSION=0.3.3
MYSQL_PORT_3306_TCP_PROTO=tcp
MYSQL_PORT_33060_TCP_ADDR=172.17.0.4
MYSQL_PORT=tcp://172.17.0.4:3306
MYSQL_PORT_3306_TCP=tcp://172.17.0.4:3306
MYSQL_PORT_33060_TCP_PORT=33060
MYSQL_ENV_MYSQL_VERSION=8.0.17-1debian9
MYSQL_PORT_33060_TCP_PROTO=tcp
MYSQL_NAME=/awesome_mcclintock/mysql
commit制作镜像
- 制作镜像的两种方法:1.Dockerfile构建镜像 ,2.commit制作镜像
- Dockerfile构建镜像:https://www.cnblogs.com/du-z/p/11357120.html
第一步:运行容器
╭─root@du-z ~
╰─➤ docker run -d nginx
第二步:配置环境
# 略
第三步:进行commit提交,制作镜像
╭─root@du-z ~
╰─➤ docker commit -p b4b75dcb00c nginx-public:v1
sha256:0a23a33fc7f72598deb80d3c4fe16bca13804bd5b171be7f8ec9caef65db6d26
╭─root@du-z ~
╰─➤ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx-public v1 0a23a33fc7f7 10 seconds ago 126MB
## 建议-p (pause)暂停制作镜像
第四步:把镜像制作成压缩包
╭─root@du-z ~
╰─➤ docker image save nginx-public:v1 > nginx-public.tar
╭─root@du-z ~
╰─➤ ls
anaconda-ks.cfg busybox:v1.tar docker-sbeed.sh nginx-public.tar
第五步:发送
# 略
第六步:使用
╭─root@du-z ~
╰─➤ docker image load < nginx-public.tar
0b9c86526c2e: Loading layer [==================================================>] 6.656kB/6.656kB
Loaded image: nginx-public:v1
╭─root@du-z ~
╰─➤ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx-public v1 0a23a33fc7f7 8 minutes ago 126MB
私有仓库registry使用
第一步:拉取到registry镜像(查看镜像)
╭─root@node1 ~
╰─➤ docker pull registry
╭─root@node1 ~
╰─➤ docker image ls
╭─root@node1 ~
╰─➤ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
registry latest f32a97de94e1 5 months ago 25.8MB
第二步:查看镜像信息
╭─root@node1 ~
╰─➤ docker image history registry
IMAGE CREATED CREATED BY SIZE COMMENT
f32a97de94e1 5 months ago /bin/sh -c #(nop) CMD ["/etc/docker/registr… 0B
<missing> 5 months ago /bin/sh -c #(nop) ENTRYPOINT ["/entrypoint.… 0B
<missing> 5 months ago /bin/sh -c #(nop) COPY file:507caa54f88c1f38… 155B
<missing> 5 months ago /bin/sh -c #(nop) EXPOSE 5000 0B
<missing> 5 months ago /bin/sh -c #(nop) VOLUME [/var/lib/registry] 0B
<missing> 5 months ago /bin/sh -c #(nop) COPY file:4544cc1555469403… 295B
<missing> 5 months ago /bin/sh -c #(nop) COPY file:21256ff7df5369f7… 20.1MB
<missing> 5 months ago /bin/sh -c set -ex && apk add --no-cache… 1.29MB
<missing> 5 months ago /bin/sh -c #(nop) CMD ["/bin/sh"] 0B
<missing> 5 months ago /bin/sh -c #(nop) ADD file:38bc6b51693b13d84… 4.41MB
第三步:编写文件
╭─root@node1 ~
╰─➤ vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://xxxxx.mirror.aliyuncs.com"], #阿里云镜像加速地址(每人一个);结尾 “,” 不能省
"insecure-registries":["192.168.137.3:5000"] #允许不安全的镜像地址
}
第四步:重启docker
╭─root@node1 ~
╰─➤ systemctl restart docker
第五步:改镜像名
╭─root@node1 ~
╰─➤ docker image tag nginx 192.168.137.3:5000/nginx:v1
第六步:运行registry
╭─root@node1 ~
╰─➤ docker run -d -v /registry:/var/lib/registry -p 5000:5000 registry
e39972548aca665813421c1b4bff85acc08400d5d0d2810f441498efff94f997
# 绑定数据卷
# 做端口映射
╭─root@node1 ~
╰─➤ ls / # 查看自动创建/registry目录
bin dev home lib64 mnt proc root sbin sys usr webroom
boot etc lib media opt registry run srv tmp var
第七步:查看registry容器运行状态,并上传镜像
╭─root@node1 ~
╰─➤ docker ps |grep 5000
05df172e9cd2 registry "/entrypoint.sh /etc…" 5 minutes ago Up 5 minutes 0.0.0.0:5000->5000/tcp funny_swartz
╭─root@node1 ~
╰─➤ docker image tag nginx 192.168.137.3:5000/nginx:v1
第八步:查看
╭─root@node1 ~
╰─➤ ls /registry/docker/registry/v2/repositories/
nginx
其他人使用
第一步:编写docker daemon文件,并重启docker
╭─root@node2 ~
╰─➤ vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://xxxxx.mirror.aliyuncs.com"],
"insecure-registries":["192.168.137.3:5000"]
}
╭─root@node2 ~
╰─➤ systemctl restart docker
第二步:拉取镜像
╭─root@node2 ~
╰─➤ docker pull 192.168.137.3:5000/nginx:v1
v1: Pulling from nginx
f5d23c7fed46: Pull complete
918b255d86e5: Pull complete
8c0120a6f561: Pull complete
Digest: sha256:dc85890ba9763fe38b178b337d4ccc802874afe3c02e6c98c304f65b08af958f
Status: Downloaded newer image for 192.168.137.3:5000/nginx:v1
192.168.137.3:5000/nginx:v1