一、介绍
Docker是使用容器container的平台,容器其实只是一个隔离的进程,除此之外啥都没有。这个进程包含一些封装特性,以便和主机还有其他的容器隔离开。一个容器依赖最多的是它的文件系统也就是image,image提供了容器运行的一切包括 code or binary, runtimes, dependencies, and 其他 filesystem 需要的对象**。**
容器在Linux上本地运行,并与其他容器共享主机的内核。它运行一个独立的进程,占用的内存不比其他的filesystem多,因此它是轻量级的。相比之下,虚拟机(VM)运行一个成熟的“guest”操作系统,通过hypervisor对主机资源进行虚拟访问。一般来说,vm会产生大量开销,超出应用程序逻辑所消耗的开销。
Linux内核提供namespace完成隔离,Cgroup完成资源限制。namespace+Cgroup构成了容器的底层技术(rootfs是容器文件系统层技术)
- IPC 进程间通信隔离
- Network 隔离网络资源
- Mount 隔离文件系统
- PID 进程隔离
- User 隔离用户权限
- UTS 用来隔离系统的hostname以及NIS domain name
Linux内核为以上6种namespace隔离提供了系统调用
Cgroups是control groups的缩写,最初由google的工程师提出,后来被整合进Linux内核。Cgroups是Linux内核提供的一种可以限制、记录、隔离进程组(process groups)所使用的物理资源(如:CPU、内存、IO等)的机制。
二、安装
参考菜鸟教程 Ubuntu Docker 安装 | 菜鸟教程 (runoob.com)
三、hello word
docker hello word
Docker 以 ubuntu15.10 镜像创建一个新容器,然后在容器里执行 bin/echo "Hello world",然后输出结果
root@deeptest-ecs:/data/git/deeptest/ui# docker run ubuntu:15.10 /bin/echo "Hello world"
Unable to find image 'ubuntu:15.10' locally
15.10: Pulling from library/ubuntu
7dcf5a444392: Pull complete
759aa75f3cee: Pull complete
3fa871dc8a2b: Pull complete
224c42ae46e7: Pull complete
Digest: sha256:02521a2d079595241c6793b2044f02eecf294034f31d6e235ac4b2b54ffc41f3
Status: Downloaded newer image for ubuntu:15.10
Hello world
- docker: Docker 的二进制执行文件。
- run: 与前面的 docker 组合来运行一个容器。
- ubuntu:15.10 指定要运行的镜像,Docker 首先从本地主机上查找镜像是否存在,如果不存在,Docker 就会从镜像仓库 Docker Hub 下载公共镜像。
- /bin/echo "Hello world": 在启动的容器里执行的命令
运行交互式的容器
我们通过 docker 的两个参数 -i -t,让 docker 运行的容器实现 "对话" 的能力:
root@deeptest-ecs:/data/git/deeptest/ui# docker run -it ubuntu:15.10 /bin/bash
root@c46b427a2018:/# pwd
/
root@c46b427a2018:/# ls
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
- -t: 在新容器内指定一个伪终端或终端。
- -i: 允许你对容器内的标准输入 (STDIN) 进行交互。
通过运行 exit 命令或者使用 CTRL+D 来退出容器。
root@c46b427a2018:/# exit
exit
问题:退出容器之后,容器的状态是?
启动容器(后台模式)
使用-d参数创建一个以进程方式运行的容器
root@deeptest-ecs:/data/git/deeptest/ui# docker run -d ubuntu:15.10 /bin/sh -c "while true; do echo hello world; sleep 1; done"
9aae0db40498d2811bb7a3b661e1b6e2e25ed6c109fa654037510d417d7eddcc
2b1b7a428627c51ab8810d541d759f072b4fc75487eed05812646b8534a2fe63
这个长字符串叫做容器 ID,对每个容器来说都是唯一的,我们可以通过容器ID操作( 查看、删除,启动、关闭)容器
可以通过 docker ps 来查看正在运行的容器:
root@deeptest-ecs:/data/git/deeptest/ui# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9aae0db40498 ubuntu:15.10 "/bin/sh -c 'while t…" 2 minutes ago Up 2 minutes jovial_bose
- CONTAINER ID: 容器 ID。
- IMAGE: 使用的镜像。
- COMMAND: 启动容器时运行的命令。
- CREATED: 容器的创建时间。
- STATUS: 容器状态。
- PORTS: 容器的端口信息和使用的连接类型(tcp\udp)。
- NAMES: 自动分配的容器名称。
状态有7种:
- created(已创建)
- restarting(重启中)
- running 或 Up(运行中)
- removing(迁移中)
- paused(暂停)
- exited(停止)
- dead(死亡)
通过docker logs CONTAINER ID 查看容器日志。
docker logs 9aae0db40498
hello world
hello world
hello world
hello world
hello world
hello world
docker logs NAME 也可以查看容器日志。
docker logs jovial_bose
hello world
hello world
hello world
hello world
hello world
hello world
四、基本命令和常用参数
镜像操作
1. 拉取镜像 docker pull [镜像名称]
root@deeptest-ecs:/home/deeptest# docker pull ubuntu
Using default tag: latest
latest: Pulling from library/ubuntu
6e3729cf69e0: Pull complete
Digest: sha256:9dc05cf19a5745c33b9327dba850480dae80310972dea9b05052162e7c7f2763
Status: Downloaded newer image for ubuntu:latest
docker.io/library/ubuntu:latest
2. 查看本地镜像 docker images [镜像名称]
root@deeptest-ecs:/data/git/deeptest/ui# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
jenkins/jenkins latest 1360700893a9 11 days ago 471MB
mysql 8.0.32 412b8cc72e4a 2 weeks ago 531MB
redis latest 2f66aad5324a 2 months ago 117MB
ubuntu latest 6b7dfa7e8fdb 4 months ago 77.8MB
kennethreitz/httpbin latest b138b9264903 4 years ago 534MB
ubuntu 15.10 9b9cb95443b5 6 years ago 137MB
docker image ls [镜像名称] 类似,可以增加参数 --format ,--filter
root@deeptest-ecs:/home/deeptest# docker image ls --format "{{.Repository}}:{{.Tag}}"
jenkins/jenkins:latest
mysql:8.0.32
redis:latest
ubuntu:latest
kennethreitz/httpbin:latest
ubuntu:15.10
3. 查找镜像 docker search [镜像名称]
root@deeptest-ecs:/home/deeptest# docker search nginx
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
nginx Official build of Nginx. 18424 [OK]
unit Official build of NGINX Unit: a polyglot app… 0 [OK]
bitnami/nginx Bitnami nginx Docker Image 159 [OK]
bitnami/nginx-ingress-controller Bitnami Docker Image for NGINX Ingress Contr… 25 [OK]
ubuntu/nginx Nginx, a high-performance reverse proxy & we… 86
4. 查看镜像详细信息 docker image inspect [镜像名称]
root@deeptest-ecs:/home/deeptest# docker image inspect ubuntu
[
{
"Id": "sha256:6b7dfa7e8fdbe18ad425dd965a1049d984f31cf0ad57fa6d5377cca355e65f03",
"RepoTags": [
"ubuntu:latest"
],
"RepoDigests": [
"ubuntu@sha256:9dc05cf19a5745c33b9327dba850480dae80310972dea9b05052162e7c7f2763"
],
"Parent": "",
"Comment": "",
"Created": "2022-12-09T01:20:31.321639501Z",
"Container": "8bf713004e88c9bc4d60fe0527a509636598e73e3ad1e71a9c9123c863c17c31",
"ContainerConfig": {
"Hostname": "8bf713004e88",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
"Tty": false,
"OpenStdin": false,
"StdinOnce": false,
"Env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
],
"Cmd": [
"/bin/sh",
"-c",
"#(nop) ",
"CMD [\"bash\"]"
],
"Image": "sha256:070606cf58d59117ddc1c48c0af233d6761addbcd4bf9e8e39fd10eef13c1bb7",
"Volumes": null,
"WorkingDir": "",
"Entrypoint": null,
"OnBuild": null,
"Labels": {}
},
"DockerVersion": "20.10.12",
"Author": "",
"Config": {
"Hostname": "",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
"Tty": false,
"OpenStdin": false,
"StdinOnce": false,
"Env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
],
"Cmd": [
"bash"
],
"Image": "sha256:070606cf58d59117ddc1c48c0af233d6761addbcd4bf9e8e39fd10eef13c1bb7",
"Volumes": null,
"WorkingDir": "",
"Entrypoint": null,
"OnBuild": null,
"Labels": null
},
"Architecture": "amd64",
"Os": "linux",
"Size": 77798780,
"VirtualSize": 77798780,
"GraphDriver": {
"Data": {
"MergedDir": "/var/lib/docker/overlay2/690a59b8a9e322821903dfee51135a42a62e56f8b9d384861f7d533c63b68622/merged",
"UpperDir": "/var/lib/docker/overlay2/690a59b8a9e322821903dfee51135a42a62e56f8b9d384861f7d533c63b68622/diff",
"WorkDir": "/var/lib/docker/overlay2/690a59b8a9e322821903dfee51135a42a62e56f8b9d384861f7d533c63b68622/work"
},
"Name": "overlay2"
},
"RootFS": {
"Type": "layers",
"Layers": [
"sha256:6515074984c6f8bb1b8a9962c8fb5f310fc85e70b04c88442a3939c026dbfad3"
]
},
"Metadata": {
"LastTagTime": "0001-01-01T00:00:00Z"
}
}
]
5.查镜像历史 docker image history [镜像名称]
root@deeptest-ecs:/home/deeptest# docker image history ubuntu
IMAGE CREATED CREATED BY SIZE COMMENT
6b7dfa7e8fdb 4 months ago /bin/sh -c #(nop) CMD ["bash"] 0B
<missing> 4 months ago /bin/sh -c #(nop) ADD file:481dd2da6de715252… 77.8MB
用 history 子命令,该命令将列出各层的创建信息
6.删除镜像 docker rmi [镜像名称:tag]
root@deeptest-ecs:/home/deeptest# docker rmi ubuntu:latest
Untagged: ubuntu:latest
Untagged: ubuntu@sha256:9dc05cf19a5745c33b9327dba850480dae80310972dea9b05052162e7c7f2763
Deleted: sha256:6b7dfa7e8fdbe18ad425dd965a1049d984f31cf0ad57fa6d5377cca355e65f03
Deleted: sha256:6515074984c6f8bb1b8a9962c8fb5f310fc85e70b04c88442a3939c026dbfad3
当有该镜像创建的容器存在时,镜像文件默认是无法被删除的
docker rmi -f 强制删除镜像,通常不建议这么做,首先停掉容器,然后删除容器,再删除镜像
可以在docker image rm命令中传入当前系统的全部镜像ID,可以通过docker image ls -q获取全部镜像ID
容器操作
1. docker run 启动容器
参数 -d
启动一个后台运行的容器。
root@deeptest-ecs:/data/git/deeptest/ui# docker run -d ubuntu:15.10 /bin/sh -c "while true; do echo hello world; sleep 1; done" 9aae0db40498d2811bb7a3b661e1b6e2e25ed6c109fa654037510d417d7eddcc
不加-d参数,容器会占据交互终端,如果 ctr+c 退出,容器就会退出。
参数 -it 容器创建就能登录进去。即分配一个伪终端,前面讲过了。
参数--name
为创建的容器命名。
root@deeptest-ecs:/home/deeptest# docker run -d --name myubuntu ubuntu:15.10 /bin/sh -c "echo 'hello world'"
ad4c3350db940e164009693cea0eebb7a14799d6ec6bd449bf0c929a9e5f54cf
root@deeptest-ecs:/home/deeptest#
root@deeptest-ecs:/home/deeptest# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ad4c3350db94 ubuntu:15.10 "/bin/sh -c 'echo 'h…" 6 seconds ago Exited (0) 5 seconds ago myubuntu
创建一个容器后台运行,并且命名myubuntu,如果加--name,则会随机生成一个名字。
参数 -p
指定端口映射,格式为:宿主机端口:容器端口
root@deeptest-ecs:/home/deeptest# docker run -d -p 6479:6379 redis
a052a76fe07d92aee7fc33b5ac295c03def4dc0b187d985e7a36a5c0432cc81c
root@deeptest-ecs:/home/deeptest# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a052a76fe07d redis "docker-entrypoint.s…" 4 seconds ago Up 3 seconds 0.0.0.0:6479->6379/tcp, :::6479->6379/tcp sad_margulis
上面例子启动一个redis容器,并且把容器的内部端口(6379) 映射到宿主机6479上。
测试下,通过redis-cli 访问 宿主机 6479 端口。
root@deeptest-ecs:/home/deeptest# redis-cli -p 6479
127.0.0.1:6479> select 0
OK
没什么问题,可以连接,执行命令。
参数 -v
v参数中,冒号":"前面的目录是宿主机目录,后面的目录是容器内目录。
root@deeptest-ecs:/home/deeptest# docker run -it -v /home/deeptest/test:/soft centos /bin/bash
[root@ef313c67087b /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin soft srv sys tmp usr var
[root@ef313c67087b /]# cd soft/
[root@ef313c67087b soft]# touch a.txt
[root@ef313c67087b soft]# ls
a.txt
创建一个容器,并且把宿主机 /home/deeptest/test 挂载到容器 /soft 下面,在容器里面进入到soft 目录,然后创建一个 a.txt 文件,接下来我们进入到宿主机 /home/deeptest/test 目录下面,查看文件是否生成了。
deeptest@deeptest-ecs:~/test$ pwd
/home/deeptest/test
deeptest@deeptest-ecs:~/test$ ls
a.txt
没问题,可以看到文件,说明挂载成功。
参数 -e
为环境设置环境变量
root@deeptest-ecs:/home/deeptest# docker run -it -e TESTENV=hello centos /bin/bash
[root@e941a98fd81a /]# echo $TESTENV
hello
[root@e941a98fd81a /]#
创建容器,并进入容器,打印变量内容,输出hello 没问题。
参数 -h
为容器设置hostname
root@deeptest-ecs:/home/deeptest# docker run -it -h localhost111 centos /bin/bash
[root@localhost111 /]# hostname
localhost111
参数 --rm
加上参数退出容器之后,容器自动删除
root@deeptest-ecs:/home/deeptest# docker run -it --rm --name mycontos centos /bin/bash
[root@7c93d8f033c2 /]# exit;
exit
root@deeptest-ecs:/home/deeptest# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9fe497d91dec centos "/bin/bash" 22 minutes ago Exited (127) 32 seconds ago determined_keldysh
e941a98fd81a centos "/bin/bash" 28 minutes ago Exited (0) 22 minutes ago great_noyce
ef313c67087b centos "/bin/bash" 41 minutes ago Exited (0) 29 minutes ago
启动容器,然后退出,列表里面并没有name为 mycontos的容器,容器被自动删除。
参数 -w
指定容器启动默认目录,容器执行命令会在这个目录,默认进入容器也会在这个目录
root@deeptest-ecs:/home/deeptest# docker run -it --rm -w /home centos /bin/bash
[root@693406160b2e home]# pwd
/home
指定容器默认工作目录/home,进入容器默认在home下面。
参数 -u
指定容器用户,默认不加为root用户
root@deeptest-ecs:/home/deeptest# docker run -it --rm -u nobody centos /bin/bash
bash-4.4$ id
uid=65534(nobody) gid=65534(nobody) groups=65534(nobody)
参数 --restart
容器重启策略,包含3个选项:no,on-failure[:times],always,unless-stopped
root@deeptest-ecs:/home/deeptest# docker run -d --restart=on-failure:3 centos /bin/sh -c "echo1 'hello world'"
9cd915cc9e22bded34359f89f2126dfbe83a20c36d314f6e954d79aeccbc9173
root@deeptest-ecs:/home/deeptest# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9cd915cc9e22 centos "/bin/sh -c 'echo1 '…" 6 seconds ago Exited (127) 4 seconds ago practical_gates
root@deeptest-ecs:/home/deeptest# docker logs 9cd915cc9e22
/bin/sh: echo1: command not found
/bin/sh: echo1: command not found
/bin/sh: echo1: command not found
/bin/sh: echo1: command not found
容器由于启动失败,重试了三次,算上第一次启动,一共四次。
2. docker ps 查看正在运行中的容器
root@deeptest-ecs:/home/deeptest# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9aae0db40498 ubuntu:15.10 "/bin/sh -c 'while t…" 6 days ago Up 6 days jovial_bose
750ad37997fd mysql:8.0.32 "docker-entrypoint.s…" 11 days ago Up 11 days 33060/tcp, 0.0.0.0:53306->3306/tcp, :::53306->3306/tcp mysql
2d8144ff4481 jenkins/jenkins "/usr/bin/tini -- /u…" 12 days ago Up 11 days 0.0.0.0:50280->8080/tcp, :::50280->8080/tcp, 0.0.0.0:50200->50000/tcp, :::50200->50000/tcp jenkins
f0bcc5fd5938 redis "docker-entrypoint.s…" 8 weeks ago Up 11 days 0.0.0.0:6379->6379/tcp, :::6379->6379/tcp myredis
参数 -a
查看所有容器
root@deeptest-ecs:/home/deeptest# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ad4c3350db94 ubuntu:15.10 "/bin/sh -c 'echo 'h…" 6 minutes ago Exited (0) 6 minutes ago myubuntu
78a7509ed34f ubuntu:15.10 "/bin/sh -c 'echo 'h…" 7 minutes ago Exited (0) 7 minutes ago happy_vaughan
9aae0db40498 ubuntu:15.10 "/bin/sh -c 'while t…" 6 days ago Up 6 days jovial_bose
750ad37997fd mysql:8.0.32 "docker-entrypoint.s…" 11 days ago Up 11 days 33060/tcp, 0.0.0.0:53306->3306/tcp, :::53306->3306/tcp mysql
2d8144ff4481 jenkins/jenkins "/usr/bin/tini -- /u…" 12 days ago Up 11 days 0.0.0.0:50280->8080/tcp, :::50280->8080/tcp, 0.0.0.0:50200->50000/tcp, :::50200->50000/tcp jenkins
f0bcc5fd5938 redis "docker-entrypoint.s…" 8 weeks ago Up 11 days 0.0.0.0:6379->6379/tcp, :::6379->6379/tcp myredis
3.docker stop 停掉容器
root@deeptest-ecs:/home/deeptest# docker stop 9aae0db40498
9aae0db40498
root@deeptest-ecs:/home/deeptest# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9aae0db40498 ubuntu:15.10 "/bin/sh -c 'while t…" 6 days ago Exited (137) 7 seconds ago jovial_bose
容器状态 Exited,7 秒前退出的
4.docker start 启动容器
root@deeptest-ecs:/home/deeptest# docker start 9aae0db40498
9aae0db40498
root@deeptest-ecs:/home/deeptest# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9aae0db40498 ubuntu:15.10 "/bin/sh -c 'while t…" 6 days ago Up 3 seconds jovial_bose
5. docker restart 重启容器
root@deeptest-ecs:/home/deeptest# docker restart 9aae0db40498
9aae0db40498
root@deeptest-ecs:/home/deeptest# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9aae0db40498 ubuntu:15.10 "/bin/sh -c 'while t…" 6 days ago Up 10 seconds jovial_bose
6. docker rm 删除容器
root@deeptest-ecs:/home/deeptest# docker rm ba513b5d03ef
ba513b5d03ef
7. docker logs 查看容器日志输出。
docker logs 9aae0db40498
hello world
hello world
hello world
8.docker top 查看容器进程
root@deeptest-ecs:/home/deeptest/test# docker top 750ad37997fd
UID PID PPID C STIME TTY TIME CMD
systemd+ 24421 24399 0 Apr14 ? 00:41:09 mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
root 293560 24399 0 Apr21 ? 00:00:00 /bin/bash
root 293633 293560 0 Apr21 ? 00:00:00 mysql -u root -p
root 330066 24399 0 Apr21 pts/1 00:00:00 /bin/bash
root 330160 330066 0 Apr21 pts/1 00:00:00 mysql -u root -p
9. docker attach 进入容器
因为此命令会退出容器终端,会导致容器的停止,建议使用 docker exec
root@deeptest-ecs:/home/deeptest# docker attach 9aae0db40498
hello world
hello world
hello world
hello world
^Chello world
root@deeptest-ecs:/home/deeptest# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9aae0db40498 ubuntu:15.10 "/bin/sh -c 'while t…" 6 days ago Exited (0) 6 seconds ago jovial_bose
10. docker exec
命令会退出容器终端,不会导致容器的停止
root@deeptest-ecs:/home/deeptest# docker exec -it 9aae0db40498 /bin/bash
root@9aae0db40498:/#
root@9aae0db40498:/#
root@9aae0db40498:/# pwd
/
root@9aae0db40498:/# exit
exit
root@deeptest-ecs:/home/deeptest# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9aae0db40498 ubuntu:15.10 "/bin/sh -c 'while t…" 6 days ago Up About a minute jovial_bose
11. docker export
导出容器快照
root@deeptest-ecs:/home/deeptest/test# docker export 9aae0db40498 > ubuntu.tar
root@deeptest-ecs:/home/deeptest/test# ls
ubuntu.tar
导出容器,容器信息保存在 ubuntu.tar
12. docker import
导入容器快照
root@deeptest-ecs:/home/deeptest/test# cat ubuntu.tar | docker import - test/ubuntu:v1
sha256:60bb9c34182c19a0373106ea6bdc1e37fc26e066e6acfbb4a996c3fa0ad9cb48
root@deeptest-ecs:/home/deeptest/test# docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
test/ubuntu v1 60bb9c34182c 8 seconds ago 119MB
使用 docker import 从容器快照文件中再导入为镜像,以上实例将快照文件 ubuntu.tar 导入到镜像 test/ubuntu:v1
使用导入的镜像,启动容器
root@deeptest-ecs:/home/deeptest/test# docker run -d test/ubuntu:v1 /bin/bash
93abfa456f7333f6790695463091ac7728075c67d0d3877c05d67dae96723f22
root@deeptest-ecs:/home/deeptest/test# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
93abfa456f73 test/ubuntu:v1 "/bin/bash" 5 seconds ago Exited (0) 4 seconds ago fervent_taussig
创建容器成功。
五、容器互通
容器互通指的是容器之间相互通信,首先想到的就是通过端口号,因为容器可以把内部端口映射到宿主机机上,那么在容器内部访问宿主机的端口就可以访问其他容器。
下面我们介绍另外一种办法。 通过 docker network create 创建一个网络
-d:参数指定 Docker 网络类型,有 bridge、overlay。
root@deeptest-ecs:/home/deeptest/test# docker network create -d bridge test-net
d7669c5645c875210b0363886f962b016cc3d207bd23858fc4ac87ef263ab973
接下来使用这个网络。
启动容器 test1
root@deeptest-ecs:/home/deeptest/test# docker run -itd --name test1 --network test-net ubuntu /bin/bash
e70c36765e3c9148faa967ca899af8bd1adb86e98c2abbcb41f171142b933f0a
启动容器test2
deeptest@deeptest-ecs:~/test$ docker run -itd --name test1 --network test-net ubuntu /bin/bash
Digest: sha256:67211c14fa74f070d27cc59d69a7fa9aeff8e28ea118ef3babc295a0428a6d21
通过以下命名安装ping 命令
apt-get update
apt install iputils-ping
接下分别进入到容器test1,test2 ,ping 对方容器
docker exec -it bfc377468f96 /bin/bash
root@bfc377468f96:/# ping test1
PING test1 (172.18.0.2) 56(84) bytes of data.
64 bytes from test1.test-net (172.18.0.2): icmp_seq=1 ttl=64 time=0.052 ms
64 bytes from test1.test-net (172.18.0.2): icmp_seq=2 ttl=64 time=0.046 ms
64 bytes from test1.test-net (172.18.0.2): icmp_seq=3 ttl=64 time=0.046 ms
deeptest@deeptest-ecs:~/test$ docker exec -it e70c36765e3c /bin/bash
root@e70c36765e3c:/# ping test2
PING test2 (172.18.0.3) 56(84) bytes of data.
64 bytes from test2.test-net (172.18.0.3): icmp_seq=1 ttl=64 time=0.041 ms
64 bytes from test2.test-net (172.18.0.3): icmp_seq=2 ttl=64 time=0.047 ms
64 bytes from test2.test-net (172.18.0.3): icmp_seq=3 ttl=64 time=0.046 ms
64 bytes from test2.test-net (172.18.0.3): icmp_seq=4 ttl=64 time=0.057 ms
两个容器互相通的。
六、镜像
镜像仓库
在 hub.docker.com 免费注册一个 Docker 账号。
docker login
按照提示输入注册的用户名密码
root@deeptest-ecs:/home/deeptest# docker login
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: codewang123
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
拉ubuntu 镜像
root@deeptest-ecs:/home/deeptest# docker pull ubuntu
Using default tag: latest
latest: Pulling from library/ubuntu
dbf6a9befcde: Pull complete
Digest: sha256:dfd64a3b4296d8c9b62aa3309984f8620b98d87e47492599ee20739e8eb54fbf
Status: Downloaded newer image for ubuntu:latest
docker.io/library/ubuntu:latest
基于一个已经存在的镜像,打个tag 创建新镜像 codewang123/ubuntu:18.04
codewang123 为你注册的用户名。
root@deeptest-ecs:/home/deeptest# docker tag ubuntu codewang123/ubuntu:18.04
root@deeptest-ecs:/home/deeptest# docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
test/ubuntu v1 60bb9c34182c 2 weeks ago 119MB
codewang123/ubuntu 18.04 3b418d7b466a 2 weeks ago 77.8MB
ubuntu latest 3b418d7b466a 2 weeks ago 77.8MB
推送镜像到仓库
root@deeptest-ecs:/home/deeptest# docker tag ubuntu codewang123/ubuntu:18.04
root@deeptest-ecs:/home/deeptest# docker push codewang123/ubuntu:18.04
The push refers to repository [docker.io/codewang123/ubuntu]
b8a36d10656a: Pushed
18.04: digest: sha256:8d741c3fb719fff7991700dbe988d1d549f32b3c24ae2276657f4a4ca0fbe42d size: 529
root@deeptest-ecs:/home/deeptest# docker search codewang123/ubuntu
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
codewang123/ubuntu
搭建私有仓库 harbor
参考下面文章
(15条消息) Docker-Hubor私有镜像仓库的搭建_dockerhub私有仓库搭建_大飞哥~BigFei的博客-CSDN博客
七、制作镜像
使用 Dockerfile 定制镜像
Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。
八、容器编排
Compose
九、一个例子
复杂例子,涉及到上述所有命令。