Docker的安装和镜像容器的基本操作
- Docker 概述
- Docker与虚拟机的区别
- namespace的六项隔离
- Docker核心概念
- 安装 Docker
- Docker 镜像操作
- 搜索镜像
- 获取镜像
- 镜像加速下载
- 查看镜像信息
- 查看下载的镜像文件信息
- 查看下载到本地的所有镜像
- 根据镜像的唯一标识 ID 号,获取镜像详细信息
- 为本地的镜像添加新的标签
- 删除镜像
- 存出镜像:将镜像保存成为本地文件
- 载入镜像:将镜像文件导入到镜像库中
- 上传镜像
- Docker 容器操作
- 容器创建:就是将镜像加载到容器的过程。
- 查看容器的运行状态
- 基于现有镜像创建
- 首先启动一个镜像,在容器里做修改
- 然后将修改后的容器提交为新的镜像,需要使用该容器的ID号创建新镜像
- 部署Apache镜像
- 建立工作目录
- 准备Dockerfile文件
- 准备执行脚本。使用方法一的情况下需要准备执行脚本
- 准备网站页面
- 生成镜像(构建镜像)
- 使用新镜像运行容器
- 使用主机IP和1314端口,测试网页访问
- Docker 的数据管理
- 数据卷
- 数据卷容器
- 端口映射
Docker 概述
Docker是一个开源的应用容器引擎,基于go语言开发并遵循了apache2.0协议开源。
Docker是在Linux容器里运行应用的开源工具,是一种轻量级的“虚拟机”。
Docker 的容器技术可以在一台主机上轻松为任何应用创建一个轻量级的、可移植的、自给自足的容器。
Docker的Logo设计为蓝色鲸鱼,拖着许多集装箱。
鲸鱼可看作为宿主机,集装箱可理解为相互隔离的容器,每个集装箱中都包含自己的应用程序。
Docker的设计宗旨:Build,Ship and Run Any App,Anywhere,
即通过对应用组件的封装、发布、部署、运行等生命周期的管理,达到应用组件级别的“一次封装,到处运行”的目的。这里的组件,既可以是一个应用,也可以是一套服务,甚至是一个完整的操作系统。
容器化越来越受欢迎,因为容器是:
●灵活:即使是最复杂的应用也可以集装箱化。
●轻量级:容器利用并共享主机内核。
●可互换:可以即时部署更新和升级。
●便携式:可以在本地构建,部署到云,并在任何地方运行。
●可扩展:可以增加并自动分发容器副本。
●可堆叠:可以垂直和即时堆叠服务。
容器是在linux上本机运行,并与其他容器共享主机的内核,它运行的是一个独立的进程,不占用其他任何可执行文件的内存,非常轻量。
虚拟机运行的是一个完整的操作系统,通过虚拟机管理程序对主机资源进行虚拟访问,相比之下需要的资源更多。
Docker与虚拟机的区别
特性 | Docker容器 | 虚拟机 |
---|---|---|
启动速度 | 秒级 | 分钟级 |
计算能力损耗 | 几乎无 | 损耗 50%左右 |
性能 | 接近原生 | 弱于 |
系统支持量(单机) | 上千个 | 几十个 |
隔离性 | 资源隔离/限制 | 完全隔离 |
namespace的六项隔离
namespace | 系统调用参数 | 隔离内容 |
---|---|---|
UTS | CLONE_NEWUTS | 主机名与域名 |
IPC | CLONE_NEWWIPC | 信号量、消息队列和共享内存 |
PID | CLONE_NEWPID | 进程编号 |
NETWORK | CLONE_NEWNET | 网络设备、网络栈、端口等 |
MOUNT | CLONE_NEWNS | 挂载点(文件系统) |
USER | CLONE_NEWUSER | 用户和用户组(3.8以后的内核才支持〉 |
Docker核心概念
●镜像
Docker的镜像是创建容器的基础,类似虚拟机的快照,可以理解为一个面向 Docker 容器引擎的只读模板。
通过镜像启动一个容器,一个镜像是一个可执行的包,其中包括运行应用程序所需要的所有内容包含代码,运行时间,库、环境变量、和配置文件。
Docker镜像也是一个压缩包,只是这个压缩包不只是可执行文件,环境部署脚本,它还包含了完整的操作系统。因为大部分的镜像都是基于某个操作系统来构建,所以很轻松的就可以构建本地和远端一样的环境,这也是Docker镜像的精髓。
●容器
Docker的容器是从镜像创建的运行实例,它可以被启动、停止和删除。所创建的每一个容器都是相互隔离、互不可见,以保证平台的安全性。
可以把容器看做是一个简易版的linux环境(包括root用户权限、镜像空间、用户空间和网络空间等)和运行在其中的应用程序。
●仓库
Docker仓库是用来集中保存镜像的地方,当创建了自己的镜像之后,可以使用push命令将它上传到公有仓库(Public)或者私有仓库(Private)。当下次要在另外一台机器上使用这个镜像时,只需从仓库获取。
Docker 的镜像、容器、日志等内容全部都默认存储在 /var/lib/docker
安装 Docker
[root@localhost ~]# systemctl stop firewalld.service && setenforce 0
[root@localhost ~]# hostnamectl set-hostname docker01
[root@localhost ~]# su
[root@docker01 ~]# yum install -y yum-utils device-mapper-persistent-data lvm2
## 安装依赖包
--------------------------------------------------------------------------------------------
yum-utils:提供了 yum-config-manager 工具。
device mapper: 是Linux内核中支持逻辑卷管理的通用设备映射机制,它为实现用于存储资源管理的块设备驱动提供了一个高度模块化的内核架构。
device mapper存储驱动程序需要 device-mapper-persistent-data 和 lvm2。
--------------------------------------------------------------------------------------------
[root@docker01 ~]# yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#设置阿里云镜像源
[root@docker01 ~]# yum install -y docker-ce docker-ce-cli containerd.io
#安装 Docker-CE并设置为开机自动启动
[root@docker01 ~]# systemctl start docker.service
--------------------------------------------------------------------------------------------
安装好的Docker系统有两个程序,Docker服务端和Docker客户端。其中Docker服务端是一个服务进程,负责管理所有容器。 Docker客户端则扮演着Docker服务端的远程控制器,可以用来控制Docker的服务端进程。大部分情况下Docker服务端和客户端运行在一台机器上。
--------------------------------------------------------------------------------------------
[root@docker01 ~]# systemctl status docker.service
● docker.service - Docker Application Container Engine
Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled; vendor preset: disabled)
Active: active (running) since 六 2023-04-22 18:16:54 CST; 9s ago
Docs: https://docs.docker.com
Main PID: 38000 (dockerd)
Memory: 31.3M
CGroup: /system.slice/docker.service
└─38000 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/conta...
4月 22 18:16:53 docker01 dockerd[38000]: time="2023-04-22T18:16:53.933111832+...c
4月 22 18:16:53 docker01 dockerd[38000]: time="2023-04-22T18:16:53.933647467+...c
4月 22 18:16:53 docker01 dockerd[38000]: time="2023-04-22T18:16:53.933670360+...c
4月 22 18:16:53 docker01 dockerd[38000]: time="2023-04-22T18:16:53.983036183+..."
4月 22 18:16:54 docker01 dockerd[38000]: time="2023-04-22T18:16:54.147471090+..."
4月 22 18:16:54 docker01 dockerd[38000]: time="2023-04-22T18:16:54.183113548+...4
4月 22 18:16:54 docker01 dockerd[38000]: time="2023-04-22T18:16:54.183319945+..."
4月 22 18:16:54 docker01 dockerd[38000]: time="2023-04-22T18:16:54.205515678+...c
4月 22 18:16:54 docker01 systemd[1]: Started Docker Application Container Engine.
4月 22 18:16:54 docker01 dockerd[38000]: time="2023-04-22T18:16:54.210028329+..."
Hint: Some lines were ellipsized, use -l to show in full.
[root@docker01 ~]# docker version
[root@docker01 ~]# docker info
## docker 信息查看
Client:
Context: default
Debug Mode: false
Plugins:
buildx: Docker Buildx (Docker Inc.)
Version: v0.10.4
Path: /usr/libexec/docker/cli-plugins/docker-buildx
compose: Docker Compose (Docker Inc.)
Version: v2.17.2
Path: /usr/libexec/docker/cli-plugins/docker-compose
Server:
Containers: 0 # 容器数量
Running: 0
Paused: 0
Stopped: 0
Images: 0 # 镜像数量
Server Version: 23.0.4 # server 版本
Storage Driver: overlay2 # docker 使用的是 overlay2 文件驱动
Backing Filesystem: xfs # 宿主机上的底层文件系统
Supports d_type: true
Using metacopy: false
Native Overlay Diff: true
userxattr: false
Logging Driver: json-file
Cgroup Driver: cgroupfs # Cgroups 驱动
Cgroup Version: 1
Plugins:
Volume: local
Network: bridge host ipvlan macvlan null overlay
Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
Swarm: inactive
Runtimes: io.containerd.runc.v2 runc
Default Runtime: runc
Init Binary: docker-init
containerd version: 2806fc1057397dbaeefbea0e4e17bddfbd388f38
runc version: v1.1.5-0-gf19387a
init version: de40ad0
Security Options:
seccomp
Profile: builtin
Kernel Version: 3.10.0-693.el7.x86_64 # 宿主机的相关信息
Operating System: CentOS Linux 7 (Core)
OSType: linux
Architecture: x86_64
CPUs: 12
Total Memory: 3.843GiB
Name: docker01
ID: 0b29a2d9-809e-444c-9c78-808fbf340159
Docker Root Dir: /var/lib/docker # docker 数据存储目录
Debug Mode: false
Registry: https://index.docker.io/v1/ # registry 地址
Labels:
Experimental: false
Insecure Registries:
127.0.0.0/8
Registry Mirrors: # 加速站点
Live Restore Enabled: false
Docker 镜像操作
搜索镜像
格式:docker search 关键字
[root@docker01 ~]# docker search nginx
获取镜像
格式:docker pull 仓库名称[:标签]
如果下载镜像时不指定标签,则默认会下载仓库中最新版本的镜像,即选择标签为 latest 标签。
docker pull nginx
镜像加速下载
浏览器访问 https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors 获取镜像加速器配置**
mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://y3m1b6i6.mirror.aliyuncs.com"]
}
EOF
systemctl daemon-reload
systemctl restart docker
查看镜像信息
镜像下载后存放在 /var/lib/docker 。
Docker 相关的本地资源存放在 /var/lib/docker/ 目录下,其中 containers 目录存放容器信息,image 目录存放镜像信息,overlay2 目录下存放具体的镜像底层文件。
查看下载的镜像文件信息
cat /var/lib/docker/image/overlay2/repositories.json
查看下载到本地的所有镜像
[root@docker01 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 6efc10a0510f 10 days ago 142MB
REPOSITORY:镜像属于的仓库;
TAG:镜像的标签信息,标记同一个仓库中的不同镜像;
IMAGE ID:镜像的唯一ID 号,唯一标识一个镜像;
CREATED:镜像创建时间;
VIRTUAL SIZE:镜像大小;
根据镜像的唯一标识 ID 号,获取镜像详细信息
格式:docker inspect 镜像ID号
docker inspect 6efc10a0510f
为本地的镜像添加新的标签
格式:docker tag 名称:[标签] 新名称:[新标签]
docker tag nginx:latest nginx:web
docker images | grep nginx
删除镜像
格式:
docker rmi 仓库名称:标签 #当一个镜像有多个标签时,只是删除其中指定的标签
或者
docker rmi 镜像ID号 #会彻底删除该镜像
注意:如果该镜像已经被容器使用,正确的做法是先删除依赖该镜像的所有容器,再去删除镜像。
docker rmi nginx:web
存出镜像:将镜像保存成为本地文件
格式:docker save -o 存储文件名 存储的镜像
docker save -o nginx nginx:latest #存出镜像命名为nginx存在当前目录下
ls -lh
载入镜像:将镜像文件导入到镜像库中
格式:
docker load < 存出的文件
或者
docker load -i 存出的文件
docker load < nginx
上传镜像
默认上传到 docker Hub 官方公共仓库,需要注册使用公共仓库的账号。https://hub.docker.com
可以使用 docker login 命令来输入用户名、密码和邮箱来完成注册和登录。
在上传镜像之前,还需要先对本地镜像添加新的标签,然后再使用 docker push 命令进行上传。
docker tag nginx:latest soscscs/nginx:web #添加新的标签时必须在前面加上自己的dockerhub的username
docker login #登录公共仓库
Username:soscscs
password:abc123456
docker push soscscs/nginx:web #上传镜像
Docker 容器操作
容器创建:就是将镜像加载到容器的过程。
新创建的容器默认处于停止状态,不运行任何程序,需要在其中发起一个进程来启动容器。
格式:docker create [选项] 镜像
常用选项:
-i:让容器开启标准输入
-t:让 Docker 分配一个伪终端 tty
-it :合起来实现和容器交互的作用,运行一个交互式会话 shell
[root@docker01 ~]# docker create -it nginx:latest /bin/bash
2154c8b190f0284bd0b2b2733f642a1228b78f9720d428952fd8ea0076e8bbad
查看容器的运行状态
[root@docker01 ~]# docker ps -a #-a 选项可以显示所有的容器
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2154c8b190f0 nginx:latest "/docker-entrypoint.…" 6 seconds ago Created dazzling_wescoff
容器的ID号 加载的镜像 运行的程序 创建时间 当前的状态 端口映射 名称
基于现有镜像创建
首先启动一个镜像,在容器里做修改
[root@docker01 ~]# docker run -it centos:7 /bin/bash
#启动容器
Unable to find image 'centos:7' locally
7: Pulling from library/centos
2d473b07cdd5: Pull complete
Digest: sha256:9d4bcbbb213dfd745b58be38b13b996ebb5ac315fe75711bd618426a630e0987
Status: Downloaded newer image for centos:7
[root@048ef3f5bf35 /]# yum install -y epel-release
#安装epel源
[root@048ef3f5bf35 /]# yum install -y nginx
#安装nginx
[root@048ef3f5bf35 /]# yum install net-tools -y
#安装tools工具
[root@048ef3f5bf35 /]# nginx
#启动服务
[root@048ef3f5bf35 /]# netstat -natp |grep 80
## #查看端口是否开启
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 131/nginx: master p
tcp6 0 0 :::80 :::* LISTEN 131/nginx: master p
[root@048ef3f5bf35 /]#
[root@048ef3f5bf35 /]# exit
exit
[root@docker01 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
048ef3f5bf35 centos:7 "/bin/bash" 7 minutes ago Exited (127) 5 seconds ago nifty_greider
2154c8b190f0 nginx:latest "/docker-entrypoint.…" 21 minutes ago Created dazzling_wescoff
然后将修改后的容器提交为新的镜像,需要使用该容器的ID号创建新镜像
[root@docker01 ~]# docker commit -m "new nginx" -a "[指定作者信息]" 048ef3f5bf35 nginx:centos
sha256:5ca4481808e7e4e34d664c905feee425516c6962e05d8bb6fa69e5b86a80c538
#常用选项:
-m 指定说明信息;
-a 指定作者信息;
-p 生成过程中停止容器的运行。
048ef3f5bf35 原容器ID。
nginx:centos 生成新的镜像名称。
[root@docker01 ~]# docker images
#查看生成的新镜像
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx centos 5ca4481808e7 2 minutes ago 482MB
docker.../nginx web 6efc10a0510f 10 days ago 142MB
nginx latest 6efc10a0510f 10 days ago 142MB
centos 7 eeb6ee3f44bd 19 months ago 204MB
[root@docker01 ~]# docker run -itd nginx:centos bash
#使用新的镜像创建容器
55d1507297fa970885698e4b85ea096bfd146598c809951c5bc927e457a4f6c2
[root@docker01 ~]# docker ps -a
#查看容器状态
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
55d1507297fa nginx:centos "bash" 21 seconds ago Up 21 seconds elegant_yalow
048ef3f5bf35 centos:7 "/bin/bash" 15 minutes ago Exited (127) 7 minutes ago nifty_greider
2154c8b190f0 nginx:latest "/docker-entrypoint.…" 28 minutes ago Created dazzling_wescoff
[root@docker01 ~]# docker exec -it 55d1507297fa bash
#进入容器
[root@55d1507297fa /]# nginx
#启动nginx服务
[root@55d1507297fa /]# netstat -natp |grep 80
#查看80端口是否开启
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 30/nginx: master pr
tcp6 0 0 :::80 :::* LISTEN 30/nginx: master pr
部署Apache镜像
建立工作目录
[root@55d1507297fa /]# exit
exit
[root@docker01 ~]# mkdir /opt/apache
[root@docker01 ~]# cd /opt/apache
准备Dockerfile文件
[root@docker01 apache]# vim Dockerfile
FROM centos:7
MAINTAINER this is apache image <dockerbmm>
RUN yum -y install httpd
EXPOSE 80
ADD index.html /var/www/html/
ADD run.sh /run.sh
RUN chmod 755 /run.sh
CMD ["/run.sh"]
ENTRYPOINT ["/usr/sbin/apachectl"]
CMD ["-D", "FOREGROUND"]
准备执行脚本。使用方法一的情况下需要准备执行脚本
[root@docker01 apache]# vim run.sh
#!/bin/bash
rm -rf /run/httpd/*
/usr/sbin/apachectl -D FOREGROUND
准备网站页面
[root@docker01 apache]# echo "this is apache web" > index.html
生成镜像(构建镜像)
[root@docker01 apache]# docker build -t httpd:centos .
使用新镜像运行容器
[root@docker01 apache]# docker run -d -p 1314:80 httpd:centos
#指定映射端口1314
f03db882f1c9d269fc45cf9ede3e2dcd3f7b8ba11e6962f4f6824c7726ddd68f
[root@docker01 apache]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f03db882f1c9 httpd:centos "/usr/sbin/apachectl…" 31 seconds ago Up 30 seconds 0.0.0.0:1314->80/tcp, :::1314->80/tcp practical_meninsky
55d1507297fa nginx:centos "bash" 21 minutes ago Up 21 minutes elegant_yalow
048ef3f5bf35 centos:7 "/bin/bash" 35 minutes ago Exited (127) 28 minutes ago nifty_greider
2154c8b190f0 nginx:latest "/docker-entrypoint.…" 49 minutes ago Created dazzling_wescoff
使用主机IP和1314端口,测试网页访问
Docker 的数据管理
管理 Docker 容器中数据主要有两种方式:数据卷(Data Volumes)和数据卷容器(DataVolumes Containers)。
数据卷
数据卷是一个供容器使用的特殊目录,位于容器中。可将宿主机的目录挂载到数据卷上,对数据卷的修改操作立刻可见,并且更新数据不会影响镜像,从而实现数据在宿主机与容器之间的迁移。数据卷的使用类似于 Linux 下对目录进行的 mount 操作。
docker pull centos:7
宿主机目录/var/www 挂载到容器中的/data1。
注意:宿主机本地目录的路径必须是使用绝对路径。如果路径不存在,Docker会自动创建相应的路径。
docker run -v /var/www:/data1 --name web1 -it centos:7 /bin/bash #-v 选项可以在容器内创建数据卷
ls
echo "this is web1" > /data1/abc.txt
exit
返回宿主机进行查看
cat /var/www/abc.txt
数据卷容器
如果需要在容器之间共享一些数据,最简单的方法就是使用数据卷容器。数据卷容器是一个普通的容器,专门提供数据卷给其他容器挂载使用。
docker run --name web2 -v /data1 -v /data2 -it centos:7 /bin/bash
echo "this is web2" > /data1/abc.txt
echo "THIS IS WEB2" > /data2/ABC.txt
#创建一个容器作为数据卷容器
使用 --volumes-from 来挂载 web2 容器中的数据卷到新的容器
docker run -it --volumes-from web2 --name web3 centos:7 /bin/bash
cat /data1/abc.txt
cat /data2/ABC.txt
端口映射
在启动容器的时候,如果不指定对应的端口,在容器外是无法通过网络来访问容器内的服务。端口映射机制将容器内的服务提供给外部网络访问,实质上就是将宿主机的端口映射到容器中,使得外部网络访问宿主机的端口便可访问容器内的服务。
docker run -d --name test1 -P nginx #随机映射端口(从32768开始)
docker run -d --name test2 -p 43000:80 nginx #指定映射端口
docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9d3c04f57a68 nginx "/docker-entrypoint.…" 4 seconds ago Up 3 seconds 0.0.0.0:43000->80/tcp test2
b04895f870e5 nginx "/docker-entrypoint.…" 17 seconds ago Up 15 seconds 0.0.0.0:49170->80/tcp test1
浏览器访问:http://192.168.80.10:43000 、http://192.168.80.10:49170