容器系列之docker基本用法
OCI: open container initiative
描述:主要是围绕容器格式和运行时制定一个开放的工业化标准
- 运行时标准
- 镜像格式标准
OCF: open container format
runC是OCF的实现之一,较新容器中使用容器引擎
docker architecture
描述: C/S架构,docker是三部分组成:client,docker_host(server),registry(仓库),无论是C,还是S端,由docker一个程序来提供,有很多子程序,其中有一个子程序叫daemon,表示运行为守护进程,所以运行为daemon就是把服务器变成为守护进程服务器来使用,可以监听在某个套接字之上,为了安全保是提供本机unix.socket的套接字,如mysql是由tcp/ip加端口,和socket文件来实现通信,docker也是C/S架构,所以服务器端是监听在某个套接字上,但是docker支持三种类型的套接字:ipv4地址加端口,ipv6地址加端口,unix sock file实际是监听在本地的一个文件上,这样另外两个没有监听,导致一个结果是只允许客户端是本地的
在docker主机上有容器,镜像,是docker主机上非常重要的组成部分,镜像来自于docker registry(docker镜像仓库),默认是到docker hub上下载镜像,镜像是分层构建的,很多基层镜像是可以共享给很多上层镜像使用的,启动容器时就是基于容器来启动,在镜像的基础上为容器创建一个专用的可写层,所以镜像也要在docker主机上存储,但是在主机上运行那些容器是无论评估的,所以有
一个专门的仓库来存储镜像,docker hub可能有几十万个镜像,下载时是默认使用https来操作,client与docker host之间也是使用http/https协议,docker的api也是一个标准的restful的api.
docker运行过程中,开始下载时可能比较慢,要从国外下载镜像,取决于互联网连接速度,在大陆有一台docker的镜像服务器CA,但是加速的效果不是很好,可以使用阿里云使用的加速(快,每个人都有自己私有账号,要在阿里云的开发者平台上注册一个账号)
docker版本:
docker-ee 企业版本
docker-ce 社区版本
docker registries
描述:docker的镜像是分层构成的,在仓库中为什么没有叫repository,而叫作registry,一个docker的registry上有两重的功能,第一是它提供镜像存储的仓库,第二还提供用户去获取镜像时的认证,还提供当前服务器上所有镜像的搜索索引,还有额外功能它是一个应用程序,在一个docker registry上仓库会有很多,但是一个docker镜像仓库,有仓库的名称,yum使用时是repository,而docker一个仓库通常只用来放一个应用程序的镜像,如nginx1.10的镜像,后来nginx升级到1.12,镜像也要同样做升级,所以也会有不同版本上的应用程序的镜像,为了使得镜像与应用程序上有一定意义的关联,通常在docker上一个仓库只放一个应用程序的镜像,这个仓库名就是应用程序的名称,通过tag来给仓库内的每个镜像添加标签,来标识每个镜像,如第一个镜像就1.10的nginx,就叫作nginx:1.10,所以使用仓库名加上标签才能标识一个镜像,一般使用者只给仓库名没有给标签,默认应该给最新版本的,如最新是nginx:1.15,还会使用nginx:lastest,这个标签会指向最新版本,nginx是奇数版本是开发版本,所以在docker hub上很多的仓库
还有基础的镜像,如就是一个独立的操作系统,centos的镜像没有使用应用程序,只有一个bashshell,最小化安装的
docker objects
描述:docker是restful风格的接口,所以每个组件都会被当作资源,或者对象,作为单独的对象都可以增、删、改、查,如对象images,containers,networks,volumes,plugins,都可以使用http来使用标准的请求get,put,delete等操作,
images:镜像仓库就是存放镜像的,类似于/bin/ls执行程序,可以启动ls /etc,ls /var两个进程,进程结束就会删除,但是执行程序还存在,镜像和容器也像这种关系存在镜像是静态的不会运行,容器是动态的,有生命周期,特别类似于程序,加载容器时也不用指定路径,有默认的加载路径
安装及使用docker
依赖的基础环境
- 64bits CPU
- Linux kernel 3.10+ 更好的支持
- Linux Kernel cgroups and namespaces
安装有两种方式
- centos7在extras repository[extras中的包是docker](centos6也可以使用docker,是redhat打的补丁,但是很不稳定)
下载docker-repo: https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/ [root@node1 ~]# wget https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo [root@node1 ~]# vim /etc/yum.repos.d/docker-ce.repo 修改url: https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/7/x86_64/stable/Packages/ 全局替换::%s@https://download.docker.com/@https://mirrors.tuna.tsinghua.edu.cn/docker-ce/@ [root@node1 ~]# yum install docker-ce -y #程序包是docker-ce
docker程序环境
环境配置文件:
/etc/sysconfig/docker-network /etc/sysconfig/docker-storage /etc/sysconfig/docker Unit File: /usr/lib/systemd/system/docker.service Docker Registry配置文件: /etc/containers/registries.conf docker-ce: 配置文件:/etc/docker/daemon.json 默认不存在
docker镜像加速
docker cn
阿里云加速器
中国科技大学
[root@node1 ~]# mkdir /etc/docker [root@node1 ~]# vim /etc/docker/daemon.json { "registry-mirrors": ["https://registry.docker-cn.com"] } [root@node1 ~]# systemctl start docker
docker命令
docker命令有针对images,container进行分类
[root@node1 ~]# docker version Client: Version: 18.06.1-ce API version: 1.38 Go version: go1.10.3 Git commit: e68fc7a Built: Tue Aug 21 17:23:03 2018 OS/Arch: linux/amd64 Experimental: false Server: Engine: Version: 18.06.1-ce API version: 1.38 (minimum version 1.12) Go version: go1.10.3 Git commit: e68fc7a Built: Tue Aug 21 17:25:29 2018 OS/Arch: linux/amd64 Experimental: false [root@node1 ~]# docker info 查看更详细的信息 Containers: 0 Running: 0 Paused: 0 Stopped: 0 Images: 0 Server Version: 18.06.1-ce Storage Driver: overlay2 #docker镜像是分层构建的,联合挂载,是要求特殊的文件系统才能实现,专用ovarlay2 Registry Mirrors: https://registry.docker-cn.com/ Live Restore Enabled: false [root@node1 ~]# docker search nginx NAME DESCRIPTION STARS OFFICIAL AUTOMATED nginx(顶级仓库是官方的) Official build of Nginx. 9617 [OK] jwilder/nginx-proxy(用户仓库) Automated Nginx reverse proxy for docker con… 1405 [OK]
docker event state
nginx镜像
描述: 一般是基于centos,ubuntu安装的,可能比较大,还可以给其他小的发行版本安装,alpine是一个专门用于构建非常小的镜像的微型发行版本,可以给程序运行提供基础的环境,但是体积很小,测试时可以使用,但是缺少调试使用的工具,生产环境尽量自行做镜像,而且带调试工具的.
Alpine知识
Alpine 操作系统是一个面向安全的轻型 Linux 发行版。它不同于通常 Linux 发行版,Alpine 采用了 musl libc 和 busybox 以减小系统的体积和运行时资源消耗,但功能上比 busybox 又完善的多,因此得到开源社区越来越多的青睐。在保持瘦身的同时,Alpine 还提供了自己的包管理工具 apk,可以通过 https://pkgs.alpinelinux.org/packages 网站上查询包信息,也可以直接通过 apk 命令直接查询和安装各种软件。
Alpine 由非商业组织维护的,支持广泛场景的 Linux发行版,它特别为资深/重度Linux用户而优化,关注安全,性能和资源效能。Alpine 镜像可以适用于更多常用场景,并且是一个优秀的可以适用于生产的基础系统/环境。
Alpine Docker 镜像也继承了 Alpine Linux 发行版的这些优势。相比于其他 Docker 镜像,它的容量非常小,仅仅只有 5 MB 左右(对比 Ubuntu 系列镜像接近 200 MB),且拥有非常友好的包管理机制。官方镜像来自 docker-alpine 项目。
目前 Docker 官方已开始推荐使用 Alpine 替代之前的 Ubuntu 做为基础镜像环境。这样会带来多个好处。包括镜像下载速度加快,镜像安全性提高,主机之间的切换更方便,占用更少磁盘空间等。
[root@node1 ~]# docker image pull nginx:1.14-alpine 1.14-alpine: Pulling from library/nginx c67f3896b22c: Pull complete ##多个层积,每层单独下载 428de5b8d58a: Pull complete 7efd417f3e28: Pull complete 61a56b170416: Pull complete Digest: sha256:f87de4bf7449cd23fd484a130e5b1b329ae75dd736576550f9bdff0d70bc3dcb Status: Downloaded newer image for nginx:1.14-alpine [root@node1 ~]# docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE nginx 1.14-alpine 14d4a58e0d2e 3 days ago 17.4MB
pull镜像并查看
[root@node1 ~]# docker pull busybox Using default tag: latest latest: Pulling from library/busybox 8c5a7da1afbc: Pull complete Digest: sha256:cb63aa0641a885f54de20f61d152187419e8f6b159ed11a251a09d115fdff9bd Status: Downloaded newer image for busybox:latest [root@node1 ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES COMMAND: 在容器中运行的命令,docker产生是容器中运行单个进程,默认是使用那个,每个镜像有定义自己默认要运行的程序,基于镜像启动时就指定, 如果没指程序,就是运行镜像自己指定程序,但是也可以修改
查看网络使用
[root@node1 ~]# docker network ls NETWORK ID NAME DRIVER SCOPE 6e12ace7269e bridge bridge local 默认 f5b3bb476293 host host local d93680d000ce none null local [root@node1 ~]# ifconfig docker0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500 本身桥,docker启动时,会自动创建一个docker桥docker0,而且默认网段是172.17,nat桥,地址转换 inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255
启动运行docker
[root@node1 ~]# docker run --help Usage: docker run [OPTIONS] IMAGE [COMMAND] [ARG...] -i, --interactive Keep STDIN open even if not attached 交互式访问要使用i,而且用t打开一个tty -t, --tty Allocate a pseudo-TTY --name string Assign a name to the container 指定名称 --rm Automatically remove the container when it exits 容器关闭可以自己让它删除 -d, --detach Run container in background and print container ID 启动后自动运行在后台 [root@node1 ~]# docker run --name b1 -it busybox:latest / # ls bin dev etc home proc root sys tmp usr var / # mkdir /data/html -p / # echo busybox > /data/html/index.html / # httpd -f -h /data/html/ [root@node1 ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 3b55e6472e3c busybox:latest "sh" 4 minutes ago Up 4 minutes b1 [root@node1 ~]# docker inspect b1|grep IPAddress "SecondaryIPAddresses": null, "IPAddress": "172.17.0.2", "IPAddress": "172.17.0.2", [root@node1 ~]# curl 172.17.0.2 相当于两个虚拟机之间通信 busybox
退出:shell退出,容器也中止
/ # exit [root@node1 ~]# docker ps -a 处理停止状态,没有被删除 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 3b55e6472e3c busybox:latest "sh" 7 minutes ago Exited (130) 55 seconds ago b1 [root@node1 ~]# docker start -i -a b1 启动停止的,如果之前运行的不是shell,就是一个nginx进程,可以不使用-a,-i / # [root@node1 ~]# docker kill b1 kill是-9,不建议使用,可能会造成数据丢失 b1 [root@node1 ~]# docker rm b1 删除停止状态的docker b1
后台运行
[root@node1 ~]# docker run --name web1 -d nginx:1.14-alpine #-d是后台运行,本地没有镜像会自动从hub下载 68784cf925762196a455d3f07271e565f45577838bf1cb27acb4c81364e9a664 [root@node1 ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 68784cf92576 nginx:1.14-alpine "nginx -g 'daemon of…" 46 seconds ago Up 43 seconds 80/tcp web1 "nginx -g 'daemon of…" :不在运行在后台,一个容器就是为了运行一个程序,如果程序在后台运行就没有程序运行,以为程序中止了,容器就会结束了, 在容器中运行任何程序一定不能让它运行在后台,运行在后台一启动就会中止,支持一个容器的骨架
进入容器内操作
[root@node1 ~]# docker run --name kvstor1 -d redis:4-alpine [root@node1 ~]# docker exec -it kvstor1 /bin/sh 绕过容器的边界exec执行命令,要交互就要it /data # ps PID USER TIME COMMAND 1 redis 0:07 redis-server 12 root 0:00 /bin/sh 17 root 0:00 ps /data # netstat -tnl Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 0.0.0.0:6379 0.0.0.0:* LISTEN tcp 0 0 :::6379 :::* LISTEN /data # redis-cli 127.0.0.1:6379> KEYS * (empty list or set)
查询容器日志
[root@node1 ~]# docker container logs kvstor1 一个容器就运行一个进程,所以日志没必要写到文件,可以放在控制台中 1:C 15 Sep 11:31:47.602 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo 1:C 15 Sep 11:31:47.602 # Redis version=4.0.11, bits=64, commit=00000000, modified=0, pid=1, just started