容器系列之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

 

  

 

 

posted @ 2018-09-20 09:43  Reid21  阅读(634)  评论(0编辑  收藏  举报