概述
Docker基础
文章目录
- Docker基础
- 一、Docker的核心概念及安装
- 1、核心概念
- 2、Docker虚拟化与普通虚拟化
- 3、Namespace和cgroup
- 4、安装Docker
- 二、Docker镜像操作
- 1、搜索镜像
- 2、获取镜像
- 3、查看镜像信息
- 4、删除镜像
- 5、导出镜像和载入镜像
- 6、创建镜像
- 三、Docker容器操作
- 1、容器的创建与启动
- 2、容器的运行与终止
- 3、容器的进入
- 4、容器的传输
- 四、Docker资源控制
- 1、对CPU的控制
- 2、对内存使用的限制
- 3、对Block IO的限制
- 五、使用Dockerfile文件构建容器
- 1、Dockerfile常用指令
- 2、基于centos:7 镜像,部署安装NGINX服务
一、Docker的核心概念及安装
1、核心概念
1、镜像:类似虚拟机的快照,一个镜像是一个完整的操作系统,属于只读的
2、容器:从镜像创建的运行实例,可以被启动、停止、删除
3、仓库:存储镜像的地方
2、Docker虚拟化与普通虚拟化
虚拟化 | 区别 | |
---|---|---|
普通虚拟化 | 在宿主机上虚拟出一套硬件后,再运行一个完整操作系统,在该系统上再运行所需应用进程,启动时间长,占用资源多 | |
Docker虚拟化 | 直接运行于宿主机的内核,容器内没有自己的内核,而且也没有进行硬件虚拟,每个容器有自己的文件系统,互不干扰,启动时间块,资源占用少,可灵活分配资源 |
特性 | 容器 | 虚拟机 |
---|---|---|
启动速度 | 秒级 | 分钟级 |
性能 | 接近原生 | 较弱 |
内存代价 | 很小 | 较多 |
硬盘使用 | 一般为MB | 一般为GB |
运行密度 | 单机支持上千个容器 | 一般几十个 |
隔离性 | 完全隔离 | 完全隔离 |
迁移性 | 优秀 | 一般 |
3、Namespace和cgroup
作用 | |
---|---|
Namespace | 实现了容器与宿主机、容器与容器之间的隔离 |
cgroup | 限制docker容器对宿主机资源的使用 |
Namespace的六项隔离 | 说明 |
---|---|
IPC | 共享内存、消息列队 |
MNT | 挂载点、文件系统 |
NET | 网络栈 |
PID | 进程编号 |
USER | 用户、组 |
UTS | 主机名、域名 |
cgroup | 限制说明 |
---|---|
内存限额 | 可以对容器物理内存和swap进行限制 |
CPU使用 | 设置容器使用cpu的权重 |
容器的Block IO | 限制bps和iops的方式控制容器读写磁盘的IO(bps: 每秒读写的数据量;iops: 每秒IO的次数) |
4、安装Docker
1、当连接到互联网时安装Docker,安装完成后启动Docker并设置为开机自动启动
[root@localhost ~]# yum install -y yum-utils device-mapper-persistent-data lvm2
[root@localhost ~]# yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
[root@localhost ~]# yum repolist
[root@localhost ~]# yum makecache
[root@localhost ~]# yum -y install docker-ce-18.09.0-3.el7 docker-ce-cli-18.09.0-3.el7
[root@localhost ~]# systemctl start docker
[root@localhost ~]# systemctl enable docker
2、通过检查Docker版本可以查看Docker服务
[root@localhost ~]# docker version
Client:
Version: 18.09.0
API version: 1.39
Go version: go1.10.4
Git commit: 4d60db4
Built: Wed Nov 7 00:48:22 2018
OS/Arch: linux/amd64
Experimental: false
Server: Docker Engine - Community
Engine:
Version: 18.09.0
API version: 1.39 (minimum version 1.12)
Go version: go1.10.4
Git commit: 4d60db4
Built: Wed Nov 7 00:19:08 2018
OS/Arch: linux/amd64
Experimental: false
3、开启路由转发功能
[root@localhost ~]# vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
[root@localhost ~]# sysctl -p
二、Docker镜像操作
1、搜索镜像
[root@localhost ~]# docker search dhcp //dhcp为关键字,可替换
[root@localhost ~]# docker search dhcp
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
networkboot/dhcpd Suitable for running a DHCP server for your … 49 [OK]
joebiellik/dhcpd DHCP server running on Alpine Linux 18 [OK]
2、获取镜像
[root@localhost ~]# docker pull networkboot/dhcpd
Using default tag: latest
latest: Pulling from networkboot/dhcpd
898c46f3b1a1: Pull complete
63366dfa0a50: Pull complete
041d4cd74a92: Pull complete
6e1bee0f8701: Pull complete
114483241095: Pull complete
ef446bdcb1f0: Pull complete
Digest: sha256:fdc7ff6f265249a104f32f1d7aed0aedaf2f2fc62ea10eebf596e2af3b670477
Status: Downloaded newer image for networkboot/dhcpd:latest
当出现以下情况时表示无法连接到docker镜像库
[root@localhost ~]# docker pull docker.io/networkboot/dhcpd
Using default tag: latest
Trying to pull repository docker.io/networkboot/dhcpd ...
Get https://registry-1.docker.io/v2/: net/http: TLS handshake timeout
[root@localhost ~]# docker pull docker.io/networkboot/dhcpd
Using default tag: latest
Trying to pull repository docker.io/networkboot/dhcpd ...
Get https://registry-1.docker.io/v2/networkboot/dhcpd/manifests/latest: Get https://auth.docker.io/token?scope=repository%3Anetworkboot%2Fdhcpd%3Apull&service=registry.docker.io: net/http: request canceled (Client.Timeout exceeded while awaiting headers)
解决办法如下
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://12azv802.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
Docker 官方中国区:https://registry.docker-cn.com
网易:http://hub-mirror.c.163.com
中国科技大学:https://docker.mirrors.ustc.edu.cn
阿里云:https://12azv802.mirror.aliyuncs.com(本人加速器地址)
3、查看镜像信息
查看本地所有镜像,添加仓库名称:[标签]时为指定镜像
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos 7 7e6257c9f8d8 3 weeks ago 203MB
networkboot/dhcpd latest 52cbff801df2 17 months ago 105MB
参数 | 说明 |
---|---|
REPOSITORY | 镜像属于的仓库 |
TAG | 镜像的标签信息,标记同—个仓库中的不同镜像 |
IMAGE ID | 镜像的唯一ID号,唯一标识了该镜像 |
CREATED | 镜像创建时间 |
SIZE | 镜像大小 |
获取镜像的详细信息 |
[root@localhost ~]# docker inspect networkboot/dhcpd:latest
为本地镜像添加新的名称为dhcp,新的标签为dhcp
[root@localhost ~]# docker tag networkboot/dhcpd:latest dhcp:dhcp
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos 7 7e6257c9f8d8 3 weeks ago 203MB
dhcp dhcp 52cbff801df2 17 months ago 105MB
networkboot/dhcpd latest 52cbff801df2 17 months ago 105MB
4、删除镜像
删除掉 dhcp:dhcp 镜像
[root@localhost ~]# docker rmi dhcp:dhcp
Untagged: dhcp:dhcp
Untagged: docker.io/networkboot/dhcpd@sha256:fdc7ff6f265249a104f32f1d7aed0aedaf2f2fc62ea10eebf596e2af3b670477
当使用docker rmi命令后面跟上镜像的ID号时,必须确保该镜像没有被容器使用才能进行,删除时系统会先删除掉所有指向该镜像的标签,然后删除该镜像文件本身。如果该镜像已经被容器使用,正确的做法是先删除依赖该镜像的所有容器,再去删除镜像。
5、导出镜像和载入镜像
1、把镜像导出到本地
[root@localhost ~]# docker save -o dhcp.tar networkboot/dhcpd:latest
[root@localhost ~]# ls -l dhcp.tar
-rw------- 1 root root 107891712 9月 2 20:50 dhcp.tar
或者
[root@localhost ~]# docker save > dhcp.tar networkboot/dhcpd:latest
2、把文件dhcp.tar中载入镜像到本地镜像库中
[root@localhost ~]# docker load --input dhcp.tar
Loaded image: networkboot/dhcpd:latest
或者
[root@localhost ~]# docker load < dhcp.tar
也可从本地光盘中导入
[root@localhost ~]# docker load --input /media/dhcp.tar
6、创建镜像
[root@localhost ~]# docker commit centos7 centos7-test
sha256:932879ca3e24c1b6223b73e3c3aee9749838e6559e481258b6315ff2bab8180f
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos7-test latest 932879ca3e24 About a minute ago 203MB
centos 7 7e6257c9f8d8 3 weeks ago 203MB
dhcp dhcp 52cbff801df2 17 months ago 105MB
networkboot/dhcpd latest 52cbff801df2 17 months ago 105MB
三、Docker容器操作
1、容器的创建与启动
1、 新建一个容器
[root@localhost ~]# docker create -it --name centos centos:7
2a3150b36e131f698baf37d5e2322b28f1a1ba30efb1e4d2cac756ac2ea32c88
2、查看容器
[root@localhost ~]# docker ps //查看正在运行的容器
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@localhost ~]# docker ps -a //查看所有容器,包括正在运行和没有运行的容器
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2a3150b36e13 centos:7 "/bin/bash" About a minute ago Created centos
3、启动容器
[root@localhost ~]# docker start centos
4、删除容器
[root@localhost ~]# docker rm centos
centos
[root@localhost ~]# docker rm -f centos //强制删除正在运行的容器
2、容器的运行与终止
1、运行一个容器
[root@localhost ~]# docker run -itd --name centos7 centos:7
398a6dc27fc5003b7ebb0e12909758bbdacd7f697dd9086c45dd35e986084e21
参数 | 说明 |
---|---|
-i | 可交互 |
-t | 伪终端 |
-d | 后台运行 |
–name | 给容器命名 |
–restart=always | 始终保持运行(随着docker开启而运行) |
–rm | 会随着退出容器的操作而删除容器 |
2、停止容器运行 |
[root@localhost ~]# docker stop centos
3、重启容器
[root@localhost ~]# docker restart centos
4、挂起容器
[root@localhost ~]# docker pause centos
5、恢复状态
[root@localhost ~]# docker unpause centos
3、容器的进入
1、正在运行着的容器centos
[root@localhost ~]# docker exec -it centos /bin/bash
[root@f8c4cf704efc /]# ls
anaconda-post.log dev home lib64 mnt proc run srv tmp var
bin etc lib media opt root sbin sys usr
[root@f8c4cf704efc /]# exit
exit
或者
[root@localhost ~]# docker attach centos
区别 | 进入方式 | 退出状态 | 本质 |
---|---|---|---|
exec | 需要添加-i -t选项,后边还需要给容器一个shell环境 | 如果执行exit退出,容器仍然保持运行 | 会生产新的进程 |
attach | 可以直接进入 | 如果执行exit退出,容器会被关闭。如果想要保持容器不被关闭,可以使用键盘: Ctrl + p Ctrl + q可以实现 | 不会生产新进程 |
4、容器的传输
宿主机和容器之前相互传东西
[root@localhost ~]# docker cp 123.txt test:/root
[root@localhost ~]# docker exec -it test /bin/bash
[root@8a106887d8bb /]# cd /root/
[root@8a106887d8bb ~]# ls
123.txt anaconda-ks.cfg
四、Docker资源控制
1、对CPU的控制
1、限制CPU使用速率(运行中)
将容器6c01602b498f的CPU使用设置为20000, 设置CPU的使用率限定为20%
[root@localhost ~]# echo 20000 > /sys/fs/cgroup/cpu/system.slice/docker-6c01602b498fca7c52b68af11f3815567cb13855284f756b499f2ef99710dd65.scope/cpu.cfs_quota_us
2、多任务按比例分享CPU
运行3个新建容器A,B,C,占用CPU资源的比例为1:1:2(25%:25%:50%)
[root@localhost ~]# docker images //查看标签
REPOSITORY TAG IMAGE ID CREATED SIZE
centos7 dhcp 78ff8fd42b57 44 hours ago 84.7 MB
dhcp dhcp 52cbff801df2 13 months ago 105 MB
docker.io/networkboot/dhcpd latest 52cbff801df2 13 months ago 105 MB
[root@localhost ~]# docker run -tid --cpu-shares 2024 dhcp:dhcp /bin/bash //不限于一个镜像
[root@localhost ~]# docker run -tid --cpu-shares 1024 dhcp:dhcp /bin/bash
[root@localhost ~]# docker run -tid --cpu-shares 2048 dhcp:dhcp /bin/bash
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d63c6513ee2e dhcp:dhcp "/entrypoint.sh /b..." 4 seconds ago Up 3 seconds sad_shirley
083da644f226 dhcp:dhcp "/entrypoint.sh /b..." 17 seconds ago Up 15 seconds boring_poincare
9fb21227e587 dhcp:dhcp "/entrypoint.sh /b..." About a minute ago Up About a minute determined_darwin
3、限制CPU内核使用
使新建容器绑定第1-2的内核使用,CPU编号为0-15
[root@localhost ~]# docker run -tid --cpuset-cpus 0,1 docker.io/networkboot/dhcpd /bin/bash
4、限制CPU的权重
限制CPU的权重为512,默认为1024
[root@localhost ~]# docker run -itd --name test -c 512 centos:7
2、对内存使用的限制
—旦容器Cgroup使用的内存超过了限制的容量,Linux内核将会尝试收回这些内存,如果仍旧没法控制使用内存在限制范围之内,进程就会被杀死。
限制新建容器的内存使用限额为 512MB
[root@localhost ~]# docker run -tid -m 512MB dhcp:dhcp
f708e0d599606750bde50af156d2604c62d18334faa02a5853d484f7dc8d1f11
限制该容器最多使用200M内存和100M的swap
[root@localhost ~]# docker run -itd --name test -m 200MB --memory-swap 100MB centos:7
3、对Block IO的限制
限制新建容器的/dev/sda的写入速度为40MB(只能限制设备而不能限制分区)
[root@localhost ~]# docker run -tid --device-write-bps /dev/sda:40MB docker.io/networkboot/dhcpd /bin/bash
[root@51c6f906a333 /]# time dd if=/dev/zero of=test bs=100M count=9 oflag=direct
9+0 records in
9+0 records out
943718400 bytes (944 MB) copied, 22.5101 s, 41.9 MB/s
real 0m22.523s
user 0m0.000s
sys 0m0.183s
–device-read-bps选项可以限制读取的速度
–device-write-tops 选项可以限制指定设备的写入速度
参数 | 说明 |
---|---|
–device-read-bps | 显示读取某个设备的bps |
–device-write-bps | 显示写入某个设备的bps |
–device-read-iops | 显示读取某个设备的iops |
–device-write-iops | 显示写入某个设备的iops |
五、使用Dockerfile文件构建容器
1、Dockerfile常用指令
常用指令 | 说明 |
---|---|
FROM | 构建镜像基于哪个镜像 |
MAINTAINER | 镜像维护者姓名或邮箱地址 |
RUN | 构建镜像时运行的shell命令 |
CMD | 运行容器时执行的shell命令 |
EXPOSE | 声明容器的服务端口 |
ENV | 设置容器环境变量 |
ADD | 拷贝文件或目录到镜像,如果是URL或压缩包会自动下载或自动解压 |
COPY | 拷贝文件或目录到镜像容器内,跟ADD类似,但不具备自动下载或解压功能 |
ENTRYPOINT | 运行容器时执行的shell命令 |
VOLUME | 指定容器挂载点到宿主机自动生成的目录或其他容器 |
USER | 为RUN、CMD、和ENTRYPOINT执行命令指定运行用户 |
WORKDIR | 为RUN、CMD、ENTRYPOINT、COPY和ADD设置工作目录,意思为切换目录 |
HEALTHCHECK | 健康检查 |
ARG | 构建时指定的一些参数 |
2、基于centos:7 镜像,部署安装NGINX服务
1、建立工作目录
[root@localhost ~]# mkdir apache
[root@localhost ~]# cd apache/
2、创建并编写Dockerfile文件
[root@localhost apache]# vim Dockerfile
FROM centos:7
RUN yum -y install gcc pcre pcre-devel zlib zlib-devel openssl openssl-devel wget
RUN wget http://nginx.org/download/nginx-1.6.0.tar.gz
RUN tar -zxf nginx-1.6.0.tar.gz -C /usr/src
RUN useradd -M -s /sbin/nologin nginx
WORKDIR /usr/src/nginx-1.6.0
RUN ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx && make && make install
RUN ln -s /usr/local/nginx/sbin/* /usr/local/sbin/
RUN nginx -t
RUN nginx
EXPOSE 80
此Dockerfile文件使用的基础镜像是centos,所以要保证首先获取此基础镜像,之后的容器运行时才会有效
[root@localhost apache]# docker pull centos:7
3、使用Dockerfile生成镜像
[root@localhost apache]# docker build -t web:centos .
注意:在自动生成镜像的命令指定镜像后,一定不要忘记写新生成镜像的存放路径,也就是空格后的 一 个“.”代表当前路径,否则会报错。
4、使用新的镜像运行容器
[root@localhost apache]# docker run -itd --name testweb -p 80 web:centos nginx -g "daemon off;"
73277ceaa7a9a72d7a729029360413cfc0364effb4062b3df25aa960c67b894a
[root@localhost apache]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
73277ceaa7a9 web:centos "nginx -g 'daemon of…" 3 seconds ago Up 2 seconds 0.0.0.0:32769->80/tcp testweb
8a106887d8bb centos:7 "/bin/bash" 30 minutes ago Up 29 minutes test
398a6dc27fc5 centos:7 "/bin/bash" About an hour ago Up About an hour centos7
最后
以上就是洁净黄蜂为你收集整理的Linux操作文档——Docker基础的全部内容,希望文章能够帮你解决Linux操作文档——Docker基础所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复