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
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值