赞
踩
Docker 是一个开源的应用容器引擎,开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙盒机制,相互之间不会有任何接口。几乎没有性能开销,可以很容易地在机器和数据中心中运行。最重要的是,他们不依赖于任何语言、框架或包装系统。
Docker 是 dotCloud 公司开源的一个基于 LXC 的高级容器引擎,源代码托管在 Github 上, 基于 go语言并遵从 Apache2.0 协议开源。
LXC(Linux Container),即Linux容器技术,是一种内核虚拟化技术,可以提供轻量级的虚拟化,以便隔离进程和资源,而且不需要提供指令解释机制以及全虚拟化的其他复杂性。主要通过kernel的
namespace
实现每个用户实例之间的相互隔离。通过cgroups
实现对资源的配额和度量。
Docker的宗旨: docker镜像一次构建,到处运行。
Docker官网:https://www.docker.com/
docker服务器可看作是鲸鱼,container容器可看作鲸鱼上的集装箱。
docker容器和虚拟机都是虚拟化技术,docker不涉及Hypervisor虚拟机,所以docker效率比虚拟机高。 启动一个docker实例大概1-2秒。
传统虚拟机技术:
docker容器技术:
技术1:namespace【实现container的进程、网络、消息、文件系统、主机名的隔离】
技术2:cgroup【实现对资源的配额和度量,如分配cpu和内存】
特点:
文件系统隔离:每个进程容器运行在一个完全独立的根文件系统中
网络隔离:每个进程容器拥有自己的网络、虚拟接口、IP地址
日志隔离:docker会收集和记录每个进程容器的标准流,用于实时检索和批量检索。
变更管理:容器文件系统的变更可以提交到新的镜像,可重复使用以创建更多的容器。
资源隔离:系统资源按需分配,相互隔离。用cgroup配置
交互式shell:docker可以分配一个虚拟终端并关联到任何容器的标准输入流上
优点:
1、比vm小,比vm快,启动一个容器实例只需1-2秒
2、docker是一个开放的平台,用于构建、发布、运行分布式应用程序。
3、可在公司局域网、云、虚拟机上使用docker
4、开发人员不用关心应用程序使用的是哪个操作系统
5、可在Unix/Linux、Windows、Mac等操作系统上使用docker
缺点:
1、docker用于应用程序时最有用,但不包括数据。日志、跟踪、数据库是放到docker容器外的。一个容器的镜像往往很小,不适合存大量数据,存储可以通过外部挂载来实现。【docker只用于计算,存储交给别人】
2、mysql和oracle数据库就不适合用docker来运行,存储数据太多。
老名字:docker、docker-engine【yum install docker】【yum install docker-engine】
新名字:docker-ce(开源)、docker-ee(闭源)
安装docker:
# 安装docker环境依赖
[root@server ~]# yum install -y yum-utils device-mapper-persistent-data lvm2
# 配置国内docker的yum源,这里使用aliyun的
官方源:https://download.docker.com/linux/centos/docker-ce.repo
阿里源:http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
清华源:https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo
# 安装docker
[root@server ~]# yum install docker-ce docker-ce-cli containerd.io -y
# 启动并开机自启
[root@server ~]# systemctl start docker && systemctl enable docker
# 查看docker的版本信息、系统信息(容器和镜像个数)
[root@server ~]# docker version
Client: Docker Engine - Community
Version: 19.03.13
API version: 1.40
Go version: go1.13.15
Git commit: 4484c46d9d
Built: Wed Sep 16 17:03:45 2020
OS/Arch: linux/amd64
Experimental: false
Server: Docker Engine - Community
Engine:
Version: 19.03.13
API version: 1.40 (minimum version 1.12)
Go version: go1.13.15
Git commit: 4484c46d9d
Built: Wed Sep 16 17:02:21 2020
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.3.7
GitCommit: 8fba4e9a7d01810a393d5d25a3621dc101981175
runc:
Version: 1.0.0-rc10
GitCommit: dc9208a3303feef5b3839f4323d9beb36df0a9dd
docker-init:
Version: 0.18.0
GitCommit: fec3683
[root@server ~]# docker info
Client:
Debug Mode: false
Server:
Containers: 0 -- 容器个数
Running: 0 -- 运行的容器个数
Paused: 0 -- 终止的容器个数
Stopped: 0 -- 停止的容器个数
Images: 0 -- 镜像个数
Server Version: 19.03.13
docker的简单使用:拉取镜像
# docker的使用
# 搜索image,OFFICIAL为OK才是安全可用的。
[root@server ~]# docker search centos
# 从docker hub上下载image到docker服务器
[root@server ~]# docker pull centos
=================================================================
pull的四种方法:
法1:使用阿里云docker镜像加速器,提升pull的速度
创建配置文件 /etc/docker/daemon.json【推荐使用】
{"registry-mirrors": ["https://e9yneuy4.mirror.aliyuncs.com"] }
修改docker服务启动脚本【不推荐使用】
# 重新加载systemd服务脚本
systemctl daemon-reload
# 重启docker服务
systemctl restart docker
法2:使用网易镜像https://c.163.com/hub#/m/home/
法3:将image导入容器
docker load -i /root/docker.io-centos-lastest-image.tar
法4:下载其他站点的应用程序
docker pull hub.c.163.com/library/tomcat:latest
=================================================================
# 列出本地所有镜像,通过info可以看到有一个镜像,通过images可以看到具体是哪个镜像。
[root@server ~]# docker info
Client:
Debug Mode: false
Server:
Containers: 0
Running: 0
Paused: 0
Stopped: 0
Images: 1
[root@server ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos latest 0d120b6ccaa8 8 weeks ago 215MB
# 删除镜像前必须删除使用该镜像创建的容器,否则只会删除镜像的TAG
[root@server ~]# docker rmi 0d120b6ccaa8
docker镜像包括程序以及程序依赖的库或二进制文件。
# 开启NAT网络转发功能
[root@server ~]# vim /etc/sysctl.conf
net.ipv4.ip_forward=1
[root@server ~]# sysctl -p # NAT立即生效
net.ipv4.ip_forward = 1
[root@server ~]# cat /proc/sys/net/ipv4/ip_forward
1
# 启动docker实例
[root@server ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@server ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos latest 0d120b6ccaa8 8 weeks ago 215MB
[root@server ~]# docker run -it centos:latest /bin/bash
# 新开一个终端查看正在运行的docker容器,可以看到有一个容器实例正在运行。
[root@server ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
19c2d3353908 centos:latest "/bin/bash" 16 seconds ago Up 15 seconds elastic_proskuriakova
# 关闭firewalld防火墙后,需重启docker服务,否则ip包转发功能无法使用。
[root@server ~]# systemctl stop firewalld
[root@server ~]# systemctl restart docker
运行命令 | 含义 |
---|---|
docker images | 查看有什么docker镜像 |
docker run -it centos:latest bash | 运行一个容器,并加载镜像centos,启动一个docker实例环境,在实例中执行bash命令 |
exit | 退出实例环境 |
参数 | 含义 |
---|---|
-i | 以交互模式运行容器,通常与-t同时使用 |
-t | 为容器重新分配一个伪输出终端,通常与-i同时使用。 |
-d | 后台运行容器,并返回容器ID |
-c | 后面跟待完成的命令 |
docker logs 容器ID|容器短ID | 从一个容器中获取日志,查看输出的内容,可用于后期检查docker实例在标准输出中弹出的错误信息或正常的信息。 |
docker ps | 列出所有运行中的容器 |
docker ps -a | 列出所有容器,包括沉睡或退出状态的容器。 |
kill | 杀死一个容器 |
run | 创建并运行一个容器实例 |
stop | 停止实例 |
start | 启动实例 |
restart | 重启实例 |
docker exec -it 容器名|容器ID /bin/bash | 进入容器 |
rm | 删除实例,前提是实例已停止 |
rm -f | 强制删除,可以是正在运行的实例。 |
实战演练:
# 后台运行一个容器实例,并在容器中的终端执行命令df -h,返回值是容器ID
[root@server ~]# docker run -d centos:latest /bin/bash -c "df -h"
3e5930e087a17e6f11298a1786844da22facb390e90115d7a8ff57cce0b33a09
[root@server ~]# docker logs 3e59
Filesystem Size Used Avail Use% Mounted on
overlay 17G 6.1G 11G 36% /
tmpfs 64M 0 64M 0% /dev
tmpfs 910M 0 910M 0% /sys/fs/cgroup
shm 64M 0 64M 0% /dev/shm
/dev/mapper/centos_master-root 17G 6.1G 11G 36% /etc/hosts
tmpfs 910M 0 910M 0% /proc/acpi
tmpfs 910M 0 910M 0% /proc/scsi
tmpfs 910M 0 910M 0% /sys/firmware
# 启动一个容器实例
[root@server ~]# docker run -it centos:latest /bin/bash
[root@397d90de57b3 /]#
# 新开一个终端,杀死启动的容器实例
[root@server ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
397d90de57b3 centos:latest "/bin/bash" 37 seconds ago Up 36 seconds recursing_jepsen
[root@server ~]# docker kill 397d90de57b3
397d90de57b3
# 启动一个容器实例
[root@server ~]# docker run -it centos:latest /bin/bash
# 新开终端
[root@server ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
21a11864b0ad centos:latest "/bin/bash" 13 seconds ago Up 12 seconds sad_albattani
[root@server ~]# docker stop 21a11864b0ad
21a11864b0ad
[root@server ~]# docker start 21a11864b0ad
21a11864b0ad
[root@server ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
21a11864b0ad centos:latest "/bin/bash" 56 seconds ago Up 17 seconds sad_albattani
# 进入容器
[root@server ~]# docker exec -it 21a11864b0ad /bin/bash
[root@21a11864b0ad /]#
# 查看所有的容器
[root@server ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
21a11864b0ad centos:latest "/bin/bash" 2 hours ago Up 2 hours sad_albattani
3e5930e087a1 centos:latest "/bin/bash -c 'df -h'" 3 hours ago Exited (0) 3 hours ago gracious_aryabhata
# 进入到某个容器
[root@server ~]# docker exec -it 21a11864b0ad /bin/bash
# 删除某个容器
[root@server ~]# docker rm 3e
3e
[root@server ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
21a11864b0ad centos:latest "/bin/bash" 3 hours ago Up 3 hours sad_albattani
安装apache服务:
[root@21a11864b0ad /]# cat /etc/redhat-release
CentOS Linux release 8.2.2004 (Core)
[root@21a11864b0ad /]# yum install -y httpd
为了把容器的当前状态保存下来,可以将当前容器制作成镜像。
Docker Image 的制作两种方法:
#保存container的当前状态到image后,然后生成对应的image【快照】
方法 1:docker commit 容器ID 新镜像名[repository:tag]
[root@server ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
21a11864b0ad centos:latest "/bin/bash" 3 hours ago Up 3 hours sad_albattani
[root@server ~]# docker commit 21a11864b0ad centos:httpd
sha256:a1b9cc833f6c02944fdd0a4021179bbe4ce28008ddc46d0d4852e3c9e65991bb
[root@server ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos httpd a1b9cc833f6c 9 seconds ago 254MB
centos latest 0d120b6ccaa8 8 weeks ago 215MB
#使用Dockerfile文件自动化制作image
方法 2:docker build
方法2具体实现:
1. 创建工作目录和Dockerfile文件
[root@server ~]# mkdir /opt/docker
[root@server ~]# cd /opt/docker/
[root@server docker]# touch Dockerfile
2. 编辑Dockerfile
[root@server docker]# vim Dockerfile
FROM centos:latest # 基于哪个镜像制作镜像
MAINTAINER <abong@qq.com> # 镜像创建者
RUN yum install -y httpd
ADD start.sh /usr/local/bin/start.sh # 本地文件替换容器内的对应路径中的文件
ADD index.html /var/www/html/index.html
CMD /usr/local/bin/start.sh # 终端执行脚本,一个Dockerfile文件中仅有一个CMD语句,存在多个时最后一个有效。
3. 创建start.sh启动脚本启动apache服务和apache首页index.html文件
root@server docker]# echo "/usr/sbin/httpd" > start.sh
[root@server docker]# chmod a+x start.sh
[root@server docker]# echo "docker image apache" > index.html
4. 使用build命令创建新的镜像
docker build -t 原镜像名[repository:tag] ./
[root@server docker]# docker build -t centos:httpd ./
5. 查看镜像
[root@server docker]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos httpd 1e0cccb31310 10 seconds ago 254MB
centos latest 0d120b6ccaa8 8 weeks ago 215MB
两种发布docker 镜像的方法:
①save image to tarball
docker save -o tar包名 镜像名[repository:tag] # 导出
docker load -i tar包名 #导入
# 导出镜像
[root@server ~]# docker save -o docker-centos-httpd.tar.gz centos:httpd
[root@server ~]# ll docker-centos-httpd.tar.gz
-rw------- 1 root root 262351872 10月 8 13:07 docker-centos-httpd.tar.gz
# 导入镜像
[root@server ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos httpd 1e0cccb31310 6 minutes ago 254MB
centos latest 0d120b6ccaa8 8 weeks ago 215MB
[root@server ~]# docker rmi centos:httpd
Untagged: centos:httpd
Deleted: sha256:1e0cccb3131058019c071b7c93f69c149482fa9cf1f0332a25b8c6711c4da94a
Deleted: sha256:ac16f03b97984ee900ef5d031f164cfaeaa6cd8dc019ce72cc959dff632501a8
Deleted: sha256:c9abe0f55ae1426a5e07f09cd9dc7ed854fe9811463871408c7c96c23160a4e2
Deleted: sha256:8764928fbf45abca97f14c34ef943767a5c9501f8e4711bd3a14c8e08b319934
Deleted: sha256:6560e60c44efb0f75384dce5c108bbe657268454aed3931f0e65c42f620e2294
Deleted: sha256:6201f9e06a0712f85fb608bcf920f6faaeb90fafa715f5de45e037f7d1e38805
Deleted: sha256:8735743637ddd6750349b5cf46d4e09663979b0f5bf9d25ceda53d865b8f55b0
Deleted: sha256:986b70081cb31f68b2aa7d32129bdb9babbc4ca2f0a55ecae18c7463bedbc206
[root@server ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos latest 0d120b6ccaa8 8 weeks ago 215MB
[root@server ~]# docker load -i docker-centos-httpd.tar.gz
45dcccff5e24: Loading layer 39.97MB/39.97MB
4d2bed0847aa: Loading layer 3.584kB/3.584kB
78d2cfc17a25: Loading layer 3.584kB/3.584kB
Loaded image: centos:httpd
[root@server ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos httpd 1e0cccb31310 7 minutes ago 254MB
centos latest 0d120b6ccaa8 8 weeks ago 215MB
②push image to docker hub
1. 注册账号:https://hub.docker.com/
2. 标记本地镜像,将其归入某一仓库。
[root@server ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos httpd b5c91959b65d About an hour ago 254MB
centos latest 0d120b6ccaa8 8 weeks ago 215MB
[root@server ~]# docker tag centos:httpd abong123/centos:httpd # 为镜像分类,仍为同一镜像。
[root@server ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
abong123/centos httpd b5c91959b65d About an hour ago 254MB
centos httpd b5c91959b65d About an hour ago 254MB
centos latest 0d120b6ccaa8 8 weeks ago 215MB
3. 登录到docker hub
[root@server ~]# docker login -u abong123 -p123456
4. 上传镜像
[root@server ~]# docker push abong123/centos:httpd
5. 删除centos:httpd镜像
[root@server ~]# docker rmi abong123/centos:httpd
Untagged: abong123/centos:httpd
Untagged: abong123/centos@sha256:64b4e1a73d1bb959e222a6098bf45cec472b23a0b95be779a9f427168b8eb3bb
6. 下载镜像
[root@server ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos httpd b5c91959b65d 2 hours ago 254MB
centos latest 0d120b6ccaa8 8 weeks ago 215MB
[root@server ~]# docker pull abong123/centos:httpd
httpd: Pulling from abong123/centos
Digest: sha256:64b4e1a73d1bb959e222a6098bf45cec472b23a0b95be779a9f427168b8eb3bb
Status: Downloaded newer image for abong123/centos:httpd
docker.io/abong123/centos:httpd
[root@server ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
abong123/centos httpd b5c91959b65d 2 hours ago 254MB
centos httpd b5c91959b65d 2 hours ago 254MB
centos latest 0d120b6ccaa8 8 weeks ago 215MB
容器端口映射原理:运行容器的应用占用某个端口号,通过NAT网络地址转换,映射到docker服务器上的某个未使用的端口号上,然后就可以通过访问docker服务器地址以及端口号,访问到容器中的应用的内容。
启动container容器并进行端口映射:
# -p 物理机80端口:容器实例的80端口
# 把容器中的80端口号映射到物理机的80端口上,这样可以使得容器中的内容可以外部访问。
[root@server ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos httpd b5c91959b65d 32 minutes ago 254MB
centos latest 0d120b6ccaa8 8 weeks ago 215MB
[root@server ~]# docker run -it -p 80:80 centos:httpd
[root@f4ad69e99787 /]# netstat -antup |grep 80
bash: netstat: command not found
[root@f4ad69e99787 /]# ifconfig
bash: ifconfig: command not found
[root@f4ad69e99787 /]# yum install net-tools -y # 安装网络软件包
[root@f4ad69e99787 /]# netstat -antup | grep 80
[root@f4ad69e99787 /]# /usr/sbin/httpd
[root@f4ad69e99787 /]# netstat -antup | grep 80 # docker容器要正常监听80端口号
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 29/httpd
[root@f4ad69e99787 /]# vi /etc/httpd/conf/httpd.conf
98 ServerName localhost:80
[root@2531def57c03 /]# exit
exit
[root@server ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@server ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f4ad69e99787 centos:httpd "/bin/bash" 8 minutes ago Exited (0) 10 seconds ago xenodochial_chandrasekhar
21a11864b0ad centos:latest "/bin/bash" 13 hours ago Exited (255) About an hour ago sad_albattani
[root@server ~]# docker start f4ad69e99787
f4ad69e99787
[root@server ~]# docker ps # 容器要正常运行
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f4ad69e99787 centos:httpd "/bin/bash" 8 minutes ago Up 2 seconds 0.0.0.0:80->80/tcp xenodochial_chandrasekhar
[root@server ~]# netstat -antup | grep 80 # docker服务器上的80端口号被占用
tcp6 0 0 :::80 :::* LISTEN 27806/docker-proxy
访问docker服务器地址:http://192.168.43.178/
若是无法正常打开物理机地址,可以检查以下内容:
①物理机的80端口号是否允许外部访问,即防火墙是否开放80端口号。
②物理界的80端口号是否被其他应用占用。
③容器的80端口号是否被占用以及apache服务是否开启
④是否开启NAT网络转发功能,可用命令cat /proc/sys/net/ipv4/ip_forward
查看,结果是1即开启。
⑤容器是否正常运行,可用docker ps
查看
进入正在运行的容器实例:
# 进入容器
docker exec -it 容器名|容器ID /bin/bash
查看容器的网络:
# 进入容器中,安装net-tools包
[root@d0d20c406c83 ~]# yum install net-tools -y
[root@d0d20c406c83 ~]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.17.0.2 netmask 255.255.0.0 broadcast 172.17.255.255
ether 02:42:ac:11:00:02 txqueuelen 0 (Ethernet)
RX packets 163 bytes 343276 (335.2 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 124 bytes 8554 (8.3 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
docker容器
的学习,可以把镜像(image)
看作是一个模板,存放在模板库(docker hub)
中,我们应该从模板库中拉取(pull)
一个模板,然后使用该模板创建一个容器实例(container)
。这时,这个容器实例就是我们用来运行应用或服务的载体。容器可以创建运行(run)
、启动(start)
、停止(stop)
、重启(restart)
、删除(rm)
、查看(ps)
,也可以用来制作镜像,而镜像可以发布到模板库中存放以便后期使用。容器中某个服务或应用所占用的端口号,可以NAT映射
到物理机的某个端口号,以便外部访问。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。