Linux操作文档——Docker基础

Docker基础


一、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 92 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

猜你喜欢

转载自blog.csdn.net/g950904/article/details/105631870