docker基础

目录

 

1.0 docker基础

下载准备,镜像加速配置

下载安装docker

查询docker-hup上的镜像

下载centos镜像docker pull centos

查看镜像

运行镜像中的bash/echo

指定名称运行centos镜像,进入容器中

指定主机名创建容器:

进入容器的方法:

1、exec命令

2、nsenter命令

基于容器做镜像,给镜像打tag

再次给tmz/web_nginx 创建一个新的标签

查看镜像默认运行命令

提交镜像时指定作者和运行的命令

推送镜像到docker hup

打包镜像

查看容器信息

查看容器服务的日志

指定映射端口

查看docker网络信息

docker三种网络类型

改变docker0桥的ip段

远程访问docker -H 10.100.100.122:2375 image ls

创建docker network网络

打开ip转发

1.2容器共享名称空间

卷共享

指定宿主机目录挂在

2.0Dockerfile

dockerfile的指令:

范例

Docker build

3.0Docker私有registry

Docker Registry分类

安装私有docker-redistry

启动服务

推送服镜像

VMware harbor 安装

安装docker-compose

4.0Docker 资源限制

官方手册(完整的可用参数列表):


1.0 docker基础

下载准备,镜像加速配置

docker-ce 配置文件默认在/etc/docker/daemon.json

{

   “registry-mirros”:[“https://registry.docker-cn.com”]

}

下载安装docker

yum remove docker    #删除旧版本docker

yum install -y yum-utils device-mapper-persistent-data lvm2  #安装aliyunDockerYum源

yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo  #安装aliyunDockerYum源

yum install docker-ce  -y     #下载docker

systemctl start docker  #启动

# yum erase  docker-common-2:1.13.1-161.git64e9980.el7_8.x86_64   解决报错

Transaction check error:

  file /usr/bin/docker from install of docker-ce-cli-1:19.03.9-3.el7.x86_64 conflicts with file from package docker-common-2:1.13.1-161.git64e9980.el7_8.x86_64

查询docker-hup上的镜像

[root@localhost ~]#  docker search centos    #starts为下载人数,official是否为官方镜像

NAME                               DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED

centos                             The official build of CentOS.                       6014                [OK]                

ansible/centos7-ansible            Ansible on Centos7                                129                                     [OK]

consol/centos-xfce-vnc             Centos container with "headless" VNC session…     115                                     [OK]

jdeathe/centos-ssh                 OpenSSH / Supervisor / EPEL/IUS/SCL Repos - …      114                                     [OK]

centos/mysql-57-centos7            MySQL 5.7 SQL database server                      76                                      

下载centos镜像docker pull centos

[root@localhost ~]# docker pull centos

Using default tag: latest

latest: Pulling from library/centos

8a29a15cefae: Pull complete

Digest: sha256:fe8d824220415eed5477b63addf40fb06c3b049404242b31982106ac204f6700

Status: Downloaded newer image for centos:latest

docker.io/library/centos:latest

查看镜像

[root@localhost ~]# docker images

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

centos              latest              470671670cac        4 months ago        237MB

运行镜像中的bash/echo

[root@localhost ~]# docker run centos /bin/echo "hello world"

hello world

查看所有镜像

[root@localhost ~]# docker ps -a

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                     PORTS               NAMES

0d22dd02d81c        centos              "/bin/echo 'hello wo…"   3 minutes ago       Exited (0) 3 minutes ago                       stupefied_feistel

指定名称运行centos镜像,进入容器中

[root@localhost ~]# docker  run --name mydocker -dit centos /bin/bash   #+d参数,容器在后台运行,不会因为空闲而退出

[root@7cfcde11b707 /]#

指定主机名创建容器:

[root@localhost ~]# docker run --name -it --nwework bridge -h [hostname] mydocker  centos

#--nwework bridge  指定创建容器的网络类型

 

[root@localhost ~]# docker run --name -it --nwework bridge -h [hostname] --dns 114.114.114.114 --dns-search ilinux.io --add-host www.baodu.com:1.1.1.1 mydocker  centos

#--dns   指定dns记录

#--dns-search 指定nds搜索域

#--add-host 添加容器host解析记录 host:ip

 

进入容器的方法:

1、exec命令

[root@localhost ~]# docker exec -it d16c7316b408  /bin/bash   #进入正在运行的容器

[root@localhost ~]# docker exec -it d16c7316b408  /bin/sh

[root@localhost ~]# docker exec -it d16c7316b408  bash

[root@localhost ~]# docker exec -it d16c7316b408  sh

 

2、nsenter命令

获取容器的pid

[root@localhost ~]# docker inspect --format "{{.State.Pid}}" mydocker  #前面命令不便,后接容器名称

6311

执行命令进入容器

[root@localhost ~]# nsenter --target 6311 --mount --uts --ipc --net --pid

基于容器做镜像,给镜像打tag

[root@localhost ~]# docker commit -p mynginx    #-p 解决容器正在运行时做出的镜像文件不完整

[root@localhost ~]# docker images

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

<none>              <none>              8c516ab6fb55        15 seconds ago      127MB    <--------新生成的镜像

nginx               latest              9beeba249f3e        12 days ago         127MB

 

[root@localhost ~]# docker tag 8c516ab6fb55 tmz/web_nginx:v0.1-1   #docker tag给镜像打标签

[root@localhost ~]# docker images

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

tmz/web_nginx       v0.1-1              8c516ab6fb55        3 minutes ago       127MB

 

再次给tmz/web_nginx 创建一个新的标签

[root@localhost ~]# docker tag tmz/web_nginx:v0.1-1 tmz/web_nginx:v0.1-1.1  #一个镜像可以有多个标签,但一个标签只能用于一个镜像

[root@localhost ~]# docker images

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

tmz/web_nginx       v0.1-1              8c516ab6fb55        4 minutes ago       127MB   #除了tag其他信息没有变化

tmz/web_nginx       v0.1-1.1             8c516ab6fb55        4 minutes ago       127MB

[root@localhost ~]# docker image rm tmz/web_nginx:v0.1-1.1  #删除标签时并不会删除镜像

Untagged: tmz/web_nginx:v0.1-1.1

 

查看镜像默认运行命令

[root@localhost ~]# docker inspect nginx

提交镜像时指定作者和运行的命令

[root@localhost ~]# docker commit -a "tmz <test@qq.com>" -c 'CMD ["/bin/httpd","-f","-h","/data/html"]' -p b1 tmz/http:v0.1

                                        提交的作者                   镜像默认运行的命令

推送镜像到docker hup

[root@localhost ~]# docker login -u dktest    #首先登陆dockerhup的账号

[root@localhost ~]# docker push tmz/httpd   #在推送镜像,把tmz/httpd仓库下的所用tag镜像推送值dockerhup

打包镜像

[root@localhost ~]# docker save -o myimages.gz tmz/web_nginx:v0.1-1   #默认打包在执行命令目录下,可共享给其他主机。

[root@localhost ~]# docker load -i myimages.gz     #通过load命令可以直接加载镜像到docker服务镜像仓库

查看容器信息

[root@localhost ~]# docker inspect contarnername

查看容器服务的日志

[root@localhost ~]# docker logs b1   

172.17.0.1 - - [29/May/2020:06:01:08 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.29.0" "-"

1.1docker网络访问

启动一个容器并随机映射端口

[root@localhost ~]# docker run --name nginx1 -it -p 80 nginx:1.14-alpine   #把容器nginx1 80端口映射到宿主机

[root@localhost ~]# docker port nginx1    #查看容器的端口映射详细

80/tcp -> 0.0.0.0:1025

指定映射端口

[root@localhost ~]# docker run --name nginx2 -it -p 10.100.100.122::80 nginx:1.14-alpine  #指定容器映射ip,冒号中间为空格则为动态,可指定端口。

#-P 暴露所有端口

查看docker网络信息

[root@localhost ~]# yum install bridge-utils   #下载命令包

[root@localhost ~]# brctl  show     #查看宿主机网卡挂载信息

[root@localhost ~]# docker network inspect bridge       #查看docker网络类型详细信息

docker三种网络类型

[root@localhost ~]# docker network ls

NETWORK ID          NAME                DRIVER              SCOPE

cde6abd95817         bridge                bridge               local     #默认使用bridge

4a1a07559444         host                  host                 local     #使用宿主机的网络创建容器

a5a4affd097b          none                  null                 local      #不给容器分配虚拟网卡,只有lo网卡

改变docker0桥的ip段

/etc/docker/daemon.json

{

   “bip”: “192.168.1.1/24”

}

打开远程访问docker

/etc/docker/daemon.json

{

   hosts: [tcp://0.0.0.0:2375, unix:///var/run/docker.sock]

}

远程访问docker -H 10.100.100.122:2375 image ls

创建docker network网络

[root@localhost ~]# docker network create -d bridge --subnet “172.26.0.0/16” --gateway “172.26.0.1” mybr0

[root@localhost ~]# docker network ls   #查看桥

[root@localhost ~]# ip link set dev veth4fe1ba6 name docker1   #修改设备名称,需要先down设备。

[root@localhost ~]# docker run --name ti -it --net mybr0 nginx:1.14-alpine  #指定网卡创建容器,不指定默认使用docker0

打开ip转发

[root@localhost ~]# cat /proc/sys/net/ipv4/ip_forward

1

1.2容器共享名称空间

网络共享

[root@localhost ~]#  docker run --name b2 --network container:b1 -it nginx:1.14-alpine /bin/sh

#创建新容器b2,并且与b1共享网络名称空间。即b2和b1的虚拟ip相同,

[root@localhost ~]#  docker inspect -f {{.NetworkSettings.IPAddress}} b1    #查看容器IP地址

卷共享

随机挂在

[root@localhost ~]# docker run --name dir1 -it -v /data nginx:1.14-alpine    #-v指定挂在路径 /data为容器内路径,宿主机上随机生成挂在路径

[root@localhost ~]# docekr inspect dir1    #查看镜像详细信息,

#source为宿主机上随机生成的路径

       "Mounts": [

            {

                "Type": "volume",

                "Name": "41125cbbd0e0da2d6721a0467a5202c028f57ee4d0609f66686a830b43669ade",

                "Source": "/var/lib/docker/volumes/41125cbbd0e0da2d6721a0467a5202c028f57ee4d0609f66686a830b43669ade/_data",

                "Destination": "/data",

                "Driver": "local",

                "Mode": "",

                "RW": true,

                "Propagation": ""

            }

[root@localhost ~]# docker inspect -f {{.Mounts}} b1   #过滤查看挂载信息

 

#宿主机创建文件

[root@localhost ~]# cd /var/lib/docker/volumes/41125cbbd0e0da2d6721a0467a5202c028f57ee4d0609f66686a830b43669ade/_data

[root@localhost _data]# echo "hello container" >>test.html

#容器中查看

/ # ls /data

test.html

指定宿主机目录挂在

[root@localhost ~]# docker run --name dir1 -it -v /data/web:/data nginx:1.14-alpine    #指定宿主机目录,不存在会自动创建

[root@localhost ~]# docker run --name dir2 -it --volumes-from dir1 nginx:1.14-alpine    #复制使用其他容器的逻辑存储卷

 

2.0Dockerfile

dockerfile的指令:

FROM:指定基础镜像(FROM是必备的指令,并且必须为第一条指令)。

RUN: 用来执行命令行命令。其基本格式:

shell格式: RUN  <命令>  ,输入在bash环境中的命令即可,一个dockerfile允许使用RUN不得超过127层,所以,使用一次RUN, 使用 ‘ \ ’ 换行,使用‘ && ’执行下一条命令。一般使用此种格式;

exec格式: RUN  <"可执行文件", "参数1", "参数2">,此种方式像是函数调用中的格式;

COPY:  复制文件。 其基本格式:

      格式1:COPY <源路径>...<目标路径>

      格式2:COPY [“<源路径1>”,....."<目标路径>"]

ADD: 更高级的复制文件,在COPY的基础上增加了一些功能,如果复制的是压缩包的话,会直接解压,而不需要在使用RUN解压;

CMD:容器启动命令。其基本格式:

shell格式: CMD <命令>

exec格式: CMD ["可执行文件", "参数1", "参数2"...]

      参数列表格式: CMD [“参数1”, “参数2”...],在指定了ENTRYPOINT指令后,用CMD指定具体的参数

ENTRYPOINT: 入口点。其基本格式分为exec和shell,

ENTRYPOINT的目的和CMD一样,都是在指定容器启动程序及参数。ENTRYPOINT在运行中可以替代,不过比CMD繁琐,需要通过docker run 的参数--entrypoint 来指定。当指定了ENTRYPOINT后,CMD的含义就发生了改变,不在是直接运行其命令,而是将CMD的内容作为参数传递给ENTRYPOINT指令。其执行时就变成了:  <ENTRYPOINT> "<CMD>"

ENV: 设置环境变量。(都可以使用这里使用的变量)其基本格式:

      格式1:ENV <key> <value>

      格式2:ENV <key1>=<value1> <key2>=<value>...

ARG: 构建参数。构建参数和ENV的效果一样,都是设置环境变量,所不同的是ARG所构建的环境变量在将来容器运行时是不存在的。其基本格式:

      格式1: ARG <参数名> [=<默认值>]

      格式2: 该默认值可以在构建命令 docker build  中用 --build-arg <参数名>=<值> 来覆盖

VOLUME: 定义匿名卷。 其基本格式:

      格式1: VOLUME ["<路径1>", "<路径2>"...]

      格式2: VOLUME <路径>

EXPOSE:  暴露端口。EXPOSE指令是声明运行时容器所提供的端口,在启动容器时不会在因为这个声明而开启端口。 其基本格式:

      格式1: EXPOSE <端口1> [<端口2>...]

WORKDIR: 指定工作目录。其基本格式:

      格式1: WORKDIR <工作目录路径>

USER: 指定当前用户。USER是帮助你切换到指定用户。 其基本格式:

      格式1: USER <用户名>

HEALTCHECK: 健康检查,判断容器的状态是否正常。 其基本格式:

      格式1: HEALTCHECK [选项] CMD <命令> :设置检查容器健康状况的命令

      格式2: HEALTCHECK NONE: 如果基础镜像有健康检查指令,使用此格式可以屏蔽掉其健康检查指令

    ONBUILD : 在Dockfile中定义一个触发器,当镜像被引用时即触发

            格式1:ONBUILD <INSTRUCTION>

            例如: ONBUILD ADD wget http://nginx.org/download/nginx-1.15.2.tar.gz /tmp

范例

FROM centos:7

LABEL maintainer test.sc

RUN useradd  www -u 1200 -M -s /sbin/nologin \

     mkdir -p /var/log/nginx

RUN yum install -y cmake pcre pcre-devel openssl openssl-devel gd-devel \

    zlib-devel gcc gcc-c++ net-tools iproute telnet wget curl &&\

    yum clean all && \

    rm -rf /var/cache/yum/*

RUN wget http://nginx.org/download/nginx-1.15.2.tar.gz

RUN tar zxf nginx-1.15.2.tar.gz

WORKDIR nginx-1.15.2

RUN ./configure --prefix=/usr/local/nginx --with-http_image_filter_module --user=www --group=www \

    --with-http_ssl_module --with-http_v2_module --with-http_stub_status_module \

    --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log \

    --pid-path=/var/run/nginx/nginx.pid

RUN make -j 4 && make install && \

    rm -rf /usr/local/nginx/html/*  && \

    echo "leilei hello" >/usr/local/nginx/html/index.html  && \

    rm -rf nginx* && \

    ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime &&\

    ln -sf /dev/stdout /var/log/nginx/access.log && \

    ln -sf /dev/stderr /var/log/nginx/error.log

RUN chown -R www.www /var/log/nginx

ENV LOG_DIR /var/log/nginx

ENV PATH $PATH:/usr/local/nginx/sbin

EXPOSE 80

WORKDIR /usr/local/nginx

CMD ["nginx","-g","daemon off;"]

Docker build

[root@localhost images]# docker build -t runoob/ubuntu:v1 ./       #-t为镜像打标签 , 使用当前目录下的Dockfile创建镜像

 

3.0Docker私有registry

Docker Registry分类

  1. Registry 用于保存docker镜像,包括镜像的层次结构和元数据
  2. 用户可自建Registry,也可使用官方的DockerHub
  3. 分类
  1. Sponsor Registry: 第三方的registry,供客户和Docker社区使用
  2. Mirror Registry  : 第三方的registry,只让客户使用。
  3. Vendor Registry : 由发布Docker镜像的供应商提供的registry
  4. Private Registry  :  通过设有防火墙和额外的安全层的私有实体提供的registry

安装私有docker-redistry

[root@localhost images]# yum install docker-registry    #下载私有仓库软件包

[root@localhost images]# rpm -ql docker-distribution    #docker-distribution 为最终服务名

/etc/docker-distribution/registry/config.yml                       #配置文件地址

/usr/bin/registry                                                 #软件命令地址

/usr/lib/systemd/system/docker-distribution.service               #服务启动命令

/usr/share/doc/docker-distribution-2.6.2

/usr/share/doc/docker-distribution-2.6.2/AUTHORS

/usr/share/doc/docker-distribution-2.6.2/CONTRIBUTING.md

/usr/share/doc/docker-distribution-2.6.2/LICENSE

/usr/share/doc/docker-distribution-2.6.2/MAINTAINERS

/usr/share/doc/docker-distribution-2.6.2/README.md

/var/lib/registry                                                 #镜像存储地址

 

[root@localhost images]# cat /etc/docker-distribution/registry/config.yml

version: 0.1

log:

  fields:

    service: registry

storage:

    cache:

        layerinfo: inmemory

    filesystem:

        rootdirectory: /var/lib/registry      #在此修改镜像存储地址

http:

    addr: :5000                           #默认启动端口

 

启动服务

[root@localhost images]# systemctl  start docker-distribution

[root@localhost images]# netstat -lntup | grep registry

tcp6       0      0 :::5000                 :::*                    LISTEN      3415/registry      

 

推送服镜像

[root@localhost node1]# docker tag myweb:v0.1-1 test.registry.com:5000/myweb:v0.1-1    #给镜像打包

[root@localhost node1]# docker push test.registry.com:5000/myweb:v0.1-1                #推送指定仓库下的镜像

[root@localhost node2]# docker pull test.registry.com:5000/myweb:v0.1-1                 #拉取私有仓库镜像

非https链接仓库地址配置

vim /etc/docker/daemon.json

{

   insecure-registries: [test.registry.cn:5000],

}

VMware harbor 安装

https://github.com/goharbor/harbor/releases 仓库地址

下载对应安装包,编辑harbor.cfg文件修改对应信息

hostname

 

安装docker-compose

yum install docker-compose -y

执行harbor下install.sh脚本

4.0Docker 资源限制

-m  5G            指定内存大小

--cpus  2          指定核心数

--cpuset-cpus 0,2   指定核心位置

--oom-kill-disable=ture  禁止oomkill掉容器

官方手册(完整的可用参数列表):

https://docs.docker.com/engine/reference/commandline/dockerd/#run-multiple-daemons

{

"authorization-plugins": [],2018/8/23

"data-root": "",

"dns": [],

"dns-opts": [],

"dns-search": [],

"exec-opts": [],

"exec-root": "",

"experimental": false,

"storage-driver": "",

"storage-opts": [],

"labels": [],

"live-restore": true,

"log-driver": "",

"log-opts": {},

"mtu": 0,

"pidfile": "",

"cluster-store": "",

"cluster-store-opts": {},

"cluster-advertise": "",

"max-concurrent-downloads": 3,

"max-concurrent-uploads": 5,

"default-shm-size": "64M",

"shutdown-timeout": 15,

"debug": true,

"hosts": [],

"log-level": "",

"tls": true,

"tlsverify": true,

"tlscacert": "",

"tlscert": "",

"tlskey": "",

"swarm-default-advertise-addr": "",

"api-cors-header": "",

"selinux-enabled": false,

"userns-remap": "",

"group": "",

"cgroup-parent": "",

"default-ulimits": {},

"init": false,

"init-path": "/usr/libexec/docker-init",

"ipv6": false,

"iptables": false,

"ip-forward": false,

"ip-masq": false,

"userland-proxy": false,

"userland-proxy-path": "/usr/libexec/docker-proxy",

"ip": "0.0.0.0",

"bridge": "",

"bip": "",

"fixed-cidr": "",

"fixed-cidr-v6": "",

"default-gateway": "",

"default-gateway-v6": "",

"icc": false,

"raw-logs": false,

"allow-nondistributable-artifacts": [],

"registry-mirrors": [],

"seccomp-profile": "",

"insecure-registries": [],

"disable-legacy-registry": false,

"no-new-privileges": false,

"default-runtime": "runc",

"oom-score-adjust": -500,

"runtimes": {

"runc": {

"path": "runc"

},

"custom": {

"path": "/usr/local/bin/my-runc-replacement",

"runtimeArgs": [

"--debug"

]

}

}

}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值