###Docker简介###
- Docker 是一个开源的应用容器引擎
- Docker 可以让开发者将所有应用软件以及它的以来打包成软件开发的标准化单元
- 开发者打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。就好像 Java 虚拟机一样,“一次编写,到处运行(Write once, run anywhere)”,而 Docker 是“一次构建,到处运行(Build once,run anywhere)”。
-
一个完整的Docker有以下几个部分组成:
DockerClient客户端
Docker Daemon守护进程
Docker Image镜像
DockerContainer容器 [2] -
Docker采用 C/S架构 Docker daemon 作为服务端接受来自客户的请求,并处理这些请求(创建、运行、分发容器)。 客户端和服务端既可以运行在一个机器上,也可通过 socket 或者RESTful API 来进行通信。
Docker daemon 一般在宿主主机后台运行,等待接收来自客户端的消息。 Docker 客户端则为用户提供一系列可执行命令,用户用这些命令实现跟 Docker daemon 交互
架构图:
Docker 的优点
轻量级:所有容器在一台机器上共享同一个操作系统内核,这样他们立即开始,并更有效地利用内存。Image 是从分层文件系统的构建,这样他们能够共享公共文件,使得磁盘使用率和 Image 的下载更加高效。
开放:Docker 容器是基于开发的标准,允许容器运行在主流的 Linux 发布版和 Microsoft 操作系统作为所有的基础设施。
安全:容器使得应用程序彼此隔离,而基础架构同时为应用程序提供了额外的保护层。
###Docker 与 虚拟机的区别###
容器与虚拟机有着类似的资源隔离和分配的优点,但不同的架构方法使容器能够更加便携,高效等。
每个虚拟机都包括应用程序、必要的二进制文件和库以及一个完整的客户操作系统(Guest OS),尽管它们被分离,它们共享并利用主机的硬件资源,将近需要十几个 GB 的大小。
容器包括应用程序及其所有的依赖,但与其他容器共享内核。它们以独立的用户空间进程形式运行在主机操作系统上。他们也不依赖于任何特定的基础设施,Docker 容器可以运行在任何计算机上,任何基础设施和任何云上。
Docker 的容器利用了 LXC,管理利用了 namespaces 来做权限的控制和隔离,cgroups 来进行资源的配置,并且还通过 aufs 来进一步提高文件系统的资源利用率,而这些技术都不是 Docker 独创。
LXC
LXC 与虚拟机的不同之处在于,它是一个操作系统级别的虚拟化环境,而不是硬件虚拟化环境。他们都做同样的事情,但 LXC 是操作系统级别的虚拟化环境,虚拟环境有它自己的进程和网络空间,而不是创建一个完整成熟的虚拟机。因此,一个 LXC 虚拟操作系统具有最小的资源需求,并启动只需几秒钟。
###Docker的部署安装###
1.配置7.5镜像的yum 源,便于解决依赖性(9850个软件包)
官方网站:https://docs.docker.com/
阿里云开源镜像网站:http://mirrors.aliyun.com/docker-ce/linux/centos/7/x86_64/stable/Packages/
软件包列表:
docker-ce-18.09.6-3.el7.x86_64.rpm
docker-ce-cli-18.09.6-3.el7.x86_64.rpm
containerd.io-1.2.5-3.1.el7.x86_64.rpm
container-selinux-2.21-1.el7.noarch.rpm
[rhel7.5] ##5099个安装包
name=rhel7.5
baseurl=http://172.25.3.250/rhel7.5
gpgcheck=0
安装软件解决依赖性:
yum install -y docker-ce-18.09.6-3.el7.x86_64.rpm
docker-ce-cli-18.09.6-3.el7.x86_64.rpm
containerd.io-1.2.5-3.1.el7.x86_64.rpm
container-selinux-2.21-1.el7.noarch.rpm
[root@server2 docker]# systemctl start docker ##启动docker,设置开机自启
[root@server2 docker]# systemctl enable docker
[root@server2 ~]# yum install -y bash-* #安装tab自动补齐的软件包
[root@server2 ~]# docker images 查看镜像
REPOSITORY TAG IMAGE ID CREATED SIZE
[root@server2 ~]# sysctl -a | grep iptable
net.bridge.bridge-nf-call-iptables = 1
[root@server2 ~]# ip addr ##docker安装好后系统会自动分配一个docker 的ip
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN
link/ether 02:42:dd:c6:a7:37 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever
[root@server2 ~]# docker version ##查看docker 的版本信息
[root@server2 ~]# docker info ##查看docker宿主机信息
##镜像的导入和容器使用##
简单搭建一个2048小游戏
获取一个容器镜像,导入到docker 引擎
[root@server2 ~]# ls
game2048.tar ##镜像
[root@server2 ~]# docker load -i game2048.tar ##导入镜像
011b303988d2: Loading layer 5.05MB/5.05MB
36e9226e74f8: Loading layer 51.46MB/51.46MB
192e9fad2abc: Loading layer 3.584kB/3.584kB
6d7504772167: Loading layer 4.608kB/4.608kB
88fca8ae768a: Loading layer 629.8kB/629.8kB
Loaded image: game2048:latest
[root@server2 ~]# docker run -d --name vm1 -p 80:80 game2048 #镜像
##--name 是自己给容器的命名 -p作端口预设 物理机端口:docker 端口 ##注意物理机端口必须是没被占用的,此时访问server宿主机的时候会直接到docker 容器
[root@server2 ~]# docker ps ##查看运行的容器
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f7cc3f6aecf8 game2048 "/bin/sh -c 'sed -i …" 44 seconds ago Up 43 seconds 0.0.0.0:80->80/tcp, 443/tcp vm1
[root@server2 ~]# docker inspect vm1 #查看容器信息
访问172.25.3.2 ##server2的ip(做了端口的)
####docker常用的基础命令#####
docker load -i 镜像名 ##导入镜像
docker run -i --name 容器名 镜像名 ##创建容器以镜像为模版
docker ps 查看容器状态
docker ps -a 查看容器状态(包或不活跃的容器)
docker attach vm1 连接容器
docker top vm1 查看容器进程
docker logs vm1 查看容器指令输出 -f参数可以实时查看
docker inspect vm1 查看容器详情
docker stats vm1 查看容器资源使用率
docker diff vm1 查看容器修改
docker stop vm1 停止容器
docker start vm1 启动容器
docker kill vm1强制杀死容器进程
docker restart vm1 重启容器
docker rm vm1 删除容器
docker pause/uppause vm1 暂停/恢复容器
基础命令操作:
[root@server2 ~]# docker load -i ubuntu.tar ##导入镜像
56abdd66ba31: Loading layer 196.8MB/196.8MB
9468150a390c: Loading layer 208.9kB/208.9kB
11083b444c90: Loading layer 4.608kB/4.608kB
5f70bf18a086: Loading layer 1.024kB/1.024kB
Loaded image: ubuntu:latest
[root@server2 ~]# docker load -i rhel7.tar
e1f5733f050b: Loading layer 147.1MB/147.1MB
[root@server2 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
game2048 latest 19299002fdbe 2 years ago 55.5MB
ubuntu latest 07c86167cdc4 3 years ago 188MB
rhel7[root@server2 ~]# docker run -it --name vm2 ubuntu # ##创建容器vm2以镜像rhel7为模版
root@dbd299a77bfb:/# ls #查看
bin dev home lib64 mnt proc run srv tmp var
boot etc lib media opt root sbin sys usr
root@dbd299a77bfb:/# uname -r ##查看版本
3.10.0-514.el7.x86_64
root@dbd299a77bfb:/# exit
exit
[root@server2 ~]# docker run -it --name vm2 ubuntu
root@dbd299a77bfb:/# ls
bin dev home lib64 mnt proc run srv tmp var
boot etc lib media opt root sbin sys usr
root@dbd299a77bfb:/# uname -r
3.10.0-514.el7.x86_64
root@dbd299a77bfb:/# exit
exit
[root@server2 ~]# docker history ubuntu:latest #查看ubuntu镜像历史信息
IMAGE CREATED CREATED BY SIZE COMMENT
07c86167cdc4 3 years ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B
<missing> 3 years ago /bin/sh -c sed -i 's/^#\s*\(deb.*universe\)$… 1.9kB
<missing> 3 years ago /bin/sh -c echo '#!/bin/sh' > /usr/sbin/poli… 195kB
<missing> 3 years ago /bin/sh -c #(nop) ADD file:b9504126dc5590898… 188MB
[root@server2 ~]# docker ps -a 查看容器状态
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ddc369328a0f rhel7 "bash" 57 seconds ago Exited (0) 17 seconds ago vm4
4e03bbd9e419 rhel7 "bash" 4 minutes ago Exited (0) 2 minutes ago vm3
dbd299a77bfb ubuntu "/bin/bash" 6 minutes ago Exited (0) 5 minutes ago vm2
f7cc3f6aecf8 game2048 "/bin/sh -c 'sed -i …" 42 minutes ago Up 42 minutes 0.0.0.0:80->80/tcp, 443/tcp vm1
[root@server2 ~]# docker rm -f vm1 ##删除vm1容器
vm1
[root@server2 ~]# docker rm -f vm2
vm2
[root@server2 ~]# docker run -it --name vm1 rhel7 bash
bash-4.2# touch file{1..10}
bash-4.2# ls
bin etc file2 file5 file8 lib mnt root srv usr
boot file1 file3 file6 file9 lib64 opt run sys var
dev file10 file4 file7 home media proc sbin tmp
[root@server2 ~]# docker rm -f vm1
vm1
[root@server2 ~]# docker run -it --name vm1 rhel7 bash
bash-4.2# ls
bin dev home lib64 mnt proc run srv tmp var
boot etc lib media opt root sbin sys usr
[root@server2 ~]# docker run -it --name vm1 rhel7 bash
bash-4.2# ls
bin dev home lib64 mnt proc run srv tmp var
boot etc lib media opt root sbin sys usr
bash-4.2# touch file{1..5}
bash-4.2# ls
bin dev file1 file3 file5 lib media opt root sbin sys usr
boot etc file2 file4 home lib64 mnt proc run srv tmp var
bash-4.2# exit
[root@server2 ~]# docker commit vm1 rhel7:v
sha256:c55491c0a5b1bb1da1731aea18dcfd38415a5e67b7d99b041a9c7f93f2f2fc9b
[root@server2 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
rhel7 v c55491c0a5b1 18 seconds ago 140MB
game2048 latest 19299002fdbe 2 years ago 55.5MB
ubuntu latest 07c86167cdc4 3 years ago 188MB
rhel7 latest 0a3eb3fde7fd 5 years ago 140MB
[root@server2 ~]# docker rm -f vm1
vm1
[root@server2 ~]# docker run -it --name vm1 rhel7:v
bash-4.2# ls
bin dev file1 file3 file5 lib media opt root sbin sys usr
boot etc file2 file4 home lib64 mnt proc run srv tmp var
[root@server2 ~]# docker run -it --name vm1 rhel7:v
bash-4.2# ls
bin dev file1 file3 file5 lib media opt root sbin sys usr
boot etc file2 file4 home lib64 mnt proc run srv tmp var
[root@server2 ~]# docker history rhel7
IMAGE CREATED CREATED BY SIZE COMMENT
0a3eb3fde7fd 5 years ago 140MB Imported from -
[root@server2 ~]# docker rm -f vm1
vm1
[root@server2 ~]# docker rmi -f rhel7:v
Untagged: rhel7:v
Deleted: sha256:c55491c0a5b1bb1da1731aea18dcfd38415a5e67b7d99b041a9c7f93f2f2fc9b
Deleted: sha256:31db62e8fe95ba48dbce72fd48e90d2bafc6769bd3a38f0c1a95833da1c5979d
[root@server2 ~]# docker history rhel7
IMAGE CREATED CREATED BY SIZE COMMENT
0a3eb3fde7fd 5 years ago 140MB Imported from -
[root@server2 ~]# docker history rhel7
IMAGE CREATED CREATED BY SIZE COMMENT
0a3eb3fde7fd 5 years ago 140MB Imported from -
[root@server2 ~]# docker history rhel7
IMAGE CREATED CREATED BY SIZE COMMENT
0a3eb3fde7fd 5 years ago 140MB Imported from -