15、docker
15.0、服务器使⽤说明:
服务器名称ip地址
controller-node1172.16.1.90
15.1、docker介绍:
1、Docker 是⼀个开源的应⽤容器引擎,基于 Go 语⾔并遵从Apache2.0协议开源。
2、Docker 可以让开发者打包他们的应⽤以及依赖包到⼀个轻量级、可移植的容器中,然后发布到任何流⾏的 Linux 机器上,也可以实现虚拟化。
容器是完全使⽤沙箱机制,相互之间不会有任何接⼝(类似 iPhone 的 app),更重要的是容器性能开销极低。
3、Docker 从 17.03 版本之后分为 CE(Community Edition: 社区版)和 EE(Enterprise Edition: 企业版),我们⽤社区版就可以了。
(1)CE版⾮常适合希望开始使⽤Docker并尝试使⽤基于容器的应⽤程序的个⼈开发⼈员和⼩型团队;
(2)EE版专为企业开发和IT团队⽽设计,他们在⽣产中⼤规模构建,发布和运⾏业务关键型应⽤程序;
5、使⽤docker容器能保持运⾏环境的⼀致性,多版本测试;技术持续更新,技术储备,符合业务需求,产品的快速迭代,快速占领⽤户;
15.2、docker架构:
1、架构图:
(1)
(2)
2、架构说明:
(1)Docker 使⽤客户端-服务器 (C/S) 架构模式,使⽤远程API来管理和创建Docker容器;
(2)Docker 容器通过 Docker 镜像来创建;
(3)容器与镜像的关系类似于⾯向对象编程中的对象与类;
(4)Docker 镜像(Images):Docker 镜像是⽤于创建 Docker 容器的模板;
(5)Docker 容器(Container):容器是独⽴运⾏的⼀个或⼀组应⽤;
Docker 的守护进程通信;
(7)Docker 主机(Host):⼀个物理或者虚拟的机器⽤于执⾏ Docker 守护进程和容器;
(9)Docker Machine:Docker Machine是⼀个简化Docker安装的命令⾏⼯具,通过⼀个简单的命令⾏即可在相应的平台上安
装Docker,⽐如VirtualBox、 Digital Ocean、Microsoft Azure。
3、docker的内核知识:
(1)docker本质上就是宿主机上的⼀个进程,docker通过namespace实现资源的隔离,通过cgroup实现了资源的限制,通过写
时复制技术(copy-on-write)实现了⾼效的⽂件操作;
(2)实际上,linux内核实现namespace的⼀个主要⽬的就是实现轻量级虚拟化(容器)服务,在同⼀个namespace下进程间可以感受到
彼此之间的变化,对外界进程⼀⽆所知,这样就可以让容器中进程产⽣错觉,仿佛⾃⼰置⾝在⼀个独⽴的系统环境之中;
(3)cgroup的api以⼀个伪⽂件系统的实现⽅式,⽤户态的程序可以通过⽂件操作是实现cgroup的组织管理,cgroup 的组织管理操作单元可以细粒度到线程的级别,另外⽤户可以创建和销毁cgroup,从⽽实现资源再分配和再利
⽤,cgroup可以对任务执
⾏挂起、恢复等操作;
15.3、docker和openstack的对⽐图:
docker是跑应⽤的,不是跑数据的,如⽤数据需要挂载新的磁盘对数据进⾏存储;
15.4、安装docker:
1、安装依赖包:
yum install container-selinux -y
2、下载需要的docker rpm包:
mkdir /tools/ -p
cd /tools/
3、安装docker:
Loading [MathJax]/jax/output/HTML-CSS/jax.js
4、查看docker版本:
docker -v
Docker version 18.09.0, build 4d60db4
5、添加docker镜像加速器:
(1)创建⼀个阿⾥云的镜像加速器的账号:
(2)修改配置⽂件参数:
mkdir -p /etc/docker/
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["b1cx9cn7.mirror.aliyuncs"]
}
EOF
systemctl daemon-reload
6、启动docker并加⼊到开机⾃启动:
systemctl start docker
systemctl enable docker
15.5、docker操作:
1、docker应⽤常⽤操作:
(1)搜索docker镜像:
docker search nginx
(2)下载docker镜像:
docker pull nginx
(3)查看下载的docker镜像列表:
[root@controller-node1 ~]# docker images
REPOSITORY          TAG                      IMAGE ID            CREATED            SIZE
nginx                    latest                  53f3fd8007f7      13 days ago      109MB
#docker的名称版本号(最新⼀版)  镜像id全局唯⼀创建镜像的时间镜像的⼤⼩(4)docker镜像导出:
docker save nginx >/tmp/nginx.tar
ls -lh /tmp/nginx.tar
-rw-r--r-- 1 root root 108M 5⽉  21 14:06 /tmp/nginx.tar
补充:解压docker镜像:
tar -xf /tmp/nginx.tar
(5)删除docker镜像:
docker rmi nginx
mysql社区版国内镜像下载(6)导⼊docker镜像:
docker load </tmp/nginx.tar
2、docker镜像存放的位置:
docker info | grep "Docker Root Dir"
Docker Root Dir: /var/lib/docker
3、启动容器:
(1)启动:
docker run -it -d --name mynginx nginx bash
参数说明:
run:启动镜像;
-it:持续的操作,显⽰⼀个终端;
-d:表⽰容器后台运⾏,如果不加该参数,容器会在前台运⾏,当退出前台或关闭scrt连接后,容器就会关闭,如果没加该参数,⼜想容器在后台运⾏,需要使⽤ctrlt(按住不放)+p+q;            --name:表⽰容器的名称;
nginx:镜像名;
bash:容器运⾏在bash环境下;
(2)查看正在运⾏的docker容器:
docker ps
补充:docker ps -a #查看所有的docker容器,包括运⾏,还有没运⾏的容器;
(3)查看容器的详细信息:
docker inspect mynginx
(4)进⼊容器:
docker exec -it mynginx bash
提⽰:如果启动容器的时候使⽤了'-d'参数,这⾥进⼊容器可以直接出来,不影响容器的后台运⾏;
补充:bash表⽰进⼊容器的命令⾏模式,如果容器中有应⽤服务脚本可以直接使⽤,⽐如'docker exec -it mynginx nginx',
表⽰直接运⾏nginx服务⽽不进⼊容器命令⾏界⾯;
(5)关闭容器:
docker stop mynginx
补充:docker kill mynginx #强制杀死容器;
(6)启动容器:
docker start mynginx
补充:docker restart mynginx #重启容器;
(7)删除容器:
docker rm -f mynginx
#-f:表⽰如果docker容器在运⾏就强制删除;
15.6、制作docker镜像:
1、下载centos基础镜像,以该镜像做容器的基础:
docker pull centos
2、启动镜像:
docker run -it -d --name lc_nginx centos bash
3、安装nginx:
(1)进⼊容器:
docker exec -it lc_nginx bash
(2)更新yum源:
yum install wget net-tools
yum install epel-release
(3)安装nginx:
yum install nginx -y
(4)运⾏nginx:
nginx
补充:后台nginx前台运⾏参数'daemon off'
4、关闭容器:
docker stop lc_nginx
5、创建nginx镜像:
docker commit -m 'my first nginx images' lc_nginx lc/nginx:v1
参数说明:
commit -m:表⽰镜像描述;
lc_nginx:容器名称;
lc/nginx:v1:lc/nginx代表镜像名称,:v1表⽰镜像的版本号;
6、查看创建的镜像:
[root@controller-node1 ~]# docker images
REPOSITORY          TAG                IMAGE ID            CREATED            SIZE
lc/nginx                v1                  073700fe569f        10 seconds ago      395MB
7、验证:
(1)启动容器:
docker run -it -d --name mynginx1 lc/nginx:v1 bash
docker ps
(2)进⼊容器:
docker exec -it mynginx1 bash
8、将制作的docker镜像上传到hub.docker:
注意:仓库名称中只能使⽤下划线,如果使⽤横向,docker search会搜不到;
(2)登录:
[root@controller-node1 ~]# 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 ht tps://hub.docker to create one.Username: hyjy2504164765
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
Login Succeeded
(3)给镜像打标签:
#获取镜像的id;
[root@controller-node1 ~]# docker images
REPOSITORY          TAG                IMAGE ID            CREATED                SIZE
lc/nginx                v1                  073700fe569f      24 minutes ago      395MB
#打标签;
[root@controller-node1 ~]# docker tag 073700fe569f hyjy2504164765/hyjy_nginx:v1
参数说明:
hyjy2504164765/hyjy_nginx #表⽰的是标签名称(新的镜像名称),"/"前⾯的内容是hub.docker的⽤户名,"/"后⾯的内容是hub.docker中的仓库名称;
:v1 #表⽰版本号;
#查看镜像:
[root@controller-node1 ~]# docker images
REPOSITORY                                TAG                      IMAGE ID              CREATED                  SIZE
hyjy2504164765/hyjy_nginx            v1                          073700fe569f        2 minutes ago          395MB
lc/nginx                                                          v1                        073700fe569f        30 minutes ago          395MB
(4)上传镜像:
1)上传:
[root@controller-node1 ~]# docker push hyjy2504164765/hyjy_nginx:v1
2)在hub.docker中查看:
(5)搜索上传的镜像仓库:
[root@controller-node1 ~]# docker search hyjy_nginx
NAME                                    DESCRIPTION        STARS              OFFICIAL            AUTOMATED
hyjy2504164765/hyjy_nginx                                0
(6)从仓库中下载镜像:
[root@controller-node1 ~]# docker rmi hyjy2504164765/hyjy_nginx:v1
[root@controller-node1 ~]# docker pull hyjy2504164765/hyjy_nginx:v1
v1: Pulling from hyjy2504164765/hyjy_nginx
Digest: sha256:a9f1e2ee11ffe063021d4ef424838fffe8982a6e87e83963c0e1e2df97b4ea90
Status: Downloaded newer image for hyjy2504164765/hyjy_nginx:v1
15.7、docker中的⽹络:
1、docker⽹络介绍:
(1)docker中的⽹络类型:
[root@controller-node1 ~]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
6924bd4782b1        bridge                bridge              local
8d1697e27ce5        host                    host                  local
144b44b784a2        none                  null                  local
(2)bridge⽹络:
在不指定--network参数或者--network=bridge的情况下创建的容器其⽹络类型都是bridge;
Docker在安装时会在宿主机上创建名为docker0的⽹桥,所谓⽹桥相当于⼀个虚拟交换机,如果使⽤上述两种⽅式run的容器都会挂
到docker0上,⽽且容器的路由会指向该docker0的ip地址(默认是172.17.0.1/16),虽然所有的容器都桥接在docker0⽹卡上,容器路由
指向docker0⽹卡,所有容器能够访问宿主机的所有⽹络,但是由于外部⽹络对docker0⽹卡没有做路由,所以⽆法进⾏访问,所以需要
做相应的映射和路由操作;
(3)host⽹络:
连接到host⽹络的容器共享Docker宿主机的⽹络栈,即容器的⽹络配置与host宿主机完全⼀样,仿佛就是宿主机中添加的应⽤,可以
通过添加--network=host参数来指定该容器使⽤host⽹络;
(4)none⽹络就是什么都没有的⽹络,挂在这个⽹络下的容器除了lo,没有其他任何⽹卡。容器run时,可以通过添加--network=none
参数来指定该容器使⽤none⽹络;
2、桥接⽹络下的应⽤:
(1)端⼝映射:
使⽤场景:需要通过宿主机⽹络访问容器应⽤;
1)启动容器:
docker run -it -d --name mynginx2  -p 172.16.1.90:80:80 lc/nginx:v1 bash
说明:-p 172.16.1.90:80:80 #表⽰把宿主机的172.16.1.90:80映射到docker容器的80端⼝,如果不写ip地址时映射宿
主机的所有⽹卡地址;
默认是tcp的映射,如果是udp(⽐如dns服务),需要改为'-p 172.16.1.90:80:80'即可;
2)在宿主机上查看映射端⼝:
[root@controller-node1 ~]# docker ps
CONTAINER ID        IMAGE              COMMAND            CREATED            STATUS              PORTS                            NAMES
e80c1e8a1762        lc/nginx:v1        "bash"                    13 minutes ago  Up 13 minutes  172.16.1.90:80->80/tcp    mynginx2
[root@controller-node1 ~]# netstat -tunlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address          Foreign Address        State      PID/Program name
tcp        0      0 172.16.1.90:80          0.0.0.0:*              LISTEN      8208/docker-proxy
3)进⼊到docker容器中:
[root@controller-node1 ~]# docker exec -it mynginx2 bash
[root@e80c1e8a1762 /]# nginx
[root@e80c1e8a1762 /]# netstat -tunlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address          Foreign Address        State      PID/Program name
tcp        0      0 0.0.0.0:80              0.0.0.0:*              LISTEN      29/nginx: master pr
4)从浏览器中访问nginx服务:
(2)容器之间的交互:
使⽤场景:因为容器的ip是dhcp分配的,不固定,链接可以将被连接的容器加⼊到需要链接容器的/etc/hosts下
⾯,可以使⽤容器名连接被连接的容器;
好处:Docker 会在两个互联的容器之间创建了⼀个安全的隧道,且不⽤映射它们的端⼝到宿主主机上,从⽽避免
了暴露应⽤端⼝到外部⽹络上,增加了容器的安全性;
缺点:启动链接端的docker容器需要被链接端的docker容器是启动的状态,否则链接端也⽆法启动(如果在使⽤过
程中被链接端docker容器挂掉,链接端的docker容器不会挂掉);
1)启动⼀个mysql容器:
docker run -it -d --name mysql centos bash
2)启动⼀个mynginx3(web服务器)容器链接容器mysql(需要启动):
docker run -it -d --name mynginx3 -p 172.16.1.90:8080:80 --link mysql lc/nginx:v1 bash
说明:--link mysql #表⽰mynginx3容器链接mysql容器;
补充:--link mysql:db #表⽰使⽤别名;
3)查看:
[root@controller-node1 ~]# docker ps
CONTAINER ID        IMAGE              COMMAND            CREATED            STATUS              PORTS                              NAMES
cb96127b7a2d        lc/nginx:v1        "bash"                    3 seconds ago    Up 2 seconds    172.16.1.90:8080-
>80/tcp  mynginx3
37fdb71ce903        centos              "bash"                      2 minutes ago    Up 2 minutes                                          mysql
4)进⼊mynginx3容器:
[root@controller-node1 ~]# docker exec -it mynginx3 bash
[root@cb96127b7a2d /]# nginx
[root@cb96127b7a2d /]# cat /etc/hosts
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。