docker基础

docker

2013 诞生,短短几年称霸 Build Once Run Anywhere!

Docker基于容器技术的轻量级虚拟化解决方案
Docker是容器引擎,把Linux的cgroup、 namespace等容器
底层技术进行封装抽象为用户提供了创建和管理容器的便
捷界面(包括命令行和API)
Docker是-一个开源项目,诞生于2013年初,基于Google
公司推出的Go语言实现
微软,红帽Linux,IBM, Oracle等 主流IT厂商已经在自己的
产品里增加对Docker的支持。
相比其他早期的容器技术,Docker引入了一 整套容器管理
的生态系统,包括分层的镜像模型,容器注册库,友好的
Rest API。

6个维度隔离

docker EE (企业版) docker CE(社区版)

安装和配置

~]# curl -o /etc/yum.repos.d/CentoS-Base.repo http://mirrors.aliyun.com/ repo/Centos-7.repo
~]# yum install epel-release -y
~]# yum list docker --show-duplicates
yum install -y yum-utils

yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce. repo
~]# yum list docker-ce --show-duplicates
I
~]#vi /etc/docker/daemon.json 对容器引擎配置

{
"graph":"/data/docker"       #工作目录 
"storage-driver":"overlay2",   ##存储驱动
”insecure-registries": [” registry . access. redhat .com",”quay.10" ], ##不安全的仓库,可加自建的仓库
registry-mirrors": [ "https ://q2gr04ke,mirror.aliyuncs.com"],   ##拉镜像需要加速源 
"bip": "172.7.5.1/24",   ##容器的ip  中间两位建议个宿主机一样,容器有问题好定位在哪个宿主机
”exec-opts": [ native.cgroupdriver=systemd" ],  ##启动后的一些额外参数 ,cgroupdriver是谷歌在2007写在Linux内核中的关于CPU内存资源的控制方法
"live-restore": true   ##docker死活不依赖引擎
}

启动第一个容器 hello-world

~]# systemctl enable docker
~]# systemctl start docker

docker info ##容器信息 /docker version

docker 引擎是典型的C/S 架构软件

启动容器4步

docker run hello-world

1. The Docker cllent contacted the DOC ker daemon.  ##客户端连接服务端
2.The Docker daemon pulled the "hello-world" image from the Docker Hub。
(amd64)       ##服务端拉取镜像从docker hub
3. The DOC ker daemon Created a new Container from that image which runs the
executable that produces the output you are currently reading. ##docker守护进程拉取的镜像创建了一个新容器可执行文件,生成当前正在读取的输出
4.The Docker daemon streamed that output to the Docker client, which sent it
to your terminal. ##Docker守护进程将输出流到发送它的Docker客户机,你的终端。

docker 引擎三大概念

镜像的结构:
{registry. name}/​{repository. name}/​{image_ name}:{tag. _name}
例如: docker.io/library/alpine:3.10.1

镜像版本或日期时间戳做标签

容器是由镜像实例化而来的

docker 镜像特性

镜像 1G 正常 ,每次更新完.拉只是增量部分,第一次会慢

docker 基于aufs 构建,base image 第一次后每个节点都有

比如:

快速清除所有镜像

systemctl stop docker      (仅限docker环境有问题,测试可以瞎搞)
rm -fr  /var/lib/docker/*
systemctl start docker

查看镜像层数

docker history  centos7.6_nginx:v1  |grep -v '0B'
 几个文件有变化就有几层

docker镜像分层:节省空间,复用.

删除也是删除层id ,镜像id 解压tar包,每层一个文件夹,镜像id文件包含层ID,CMD,ENV等等

镜像命令

1.登录

docker login docker.io

2. 查找镜像

docker search alpine

3.下载镜像

​ docker pull alpine 直接下载镜像 (啥也不加,默认从docker-hub下载)

​ docker pull alpine:3.10.1 下载指定tag

​ docker pull docker.io/library/alpine:3.10.1

镜像结构:registry_name/repository_name/image_name:tag_name

例如: docker.io/library/alpine:3.10.1

4. 查看本地镜像

docker images

latest 实际上是个指针 指向一个版本

5.给镜像打标签

docker tag 965ea09ff2eb docker.io/jiajun01/alpine:v3.10.3

6.推送镜像

docker push docker.io/jiajun01/alpine:v3.10.1 推送镜像

7.删除镜像

docker rmi docker.io/jiajun01/alpine:v3.10.1 删除镜像(标签)

​ docker rmi -f 8984y323758 强制本地删除

容器命令

1. 启动容器

docker run是日常用的最频繁用的命令之一,同样也是较为复杂的命令 ;之一
命令格式: docker run (OPTIONS] IMAGE [COMMAND] [ARG..]
OPTIONS :选项
i:表示启动一个可交互的容器.井持续打开标准输入
-t:表示使用终端关联到容器的标准输入输出上
-d :表示将容器放置后台运行
--rm:退出后即删除容器
--name:表示定义容器唯一名称
IMAGE :表示要运行的镜像
COMMAND :表示启动容器时要运行的命令*

docker run -ti gao01/alpine:latest /bin/sh

非交互式启动一个容器

docker run --rm gao01/alpine:latest /bin/echo hello 执行完就从 列表中删除

非交互式启动一个后台容器

docker run -d --name myalpine gao01/alpine:latest /bin/sleep 300 需要命令夯住

查看容器

查看运行中的容器

docker ps

查看所有容器

docker ps -a

查看属主机进程

ps aux |grep sleep |grep -v grep 能查到刚才的sleep

进入正在运行的容器

docker exec -ti e0b7fcf28418 /bin/sh

停止/启动/重启 容器

docker stop/start/restart e0b7fcf28418

docker stop/start/restart myalpine

删除容器

docker rm myalpine

docker rm -f myalpine (运行状态强制删)

批量删除属主机上已经退出的的容器

for i in `docker ps -a |grep -i exit|awk '{print $1}'`;do docker rm -f $i ;done

提交镜像

docker commit -p myalpine gao01/alpine:v1.1_with_1.txt (创建个1.txt文件 -p 提交期间暂停容器)

导出镜像

docker save 433rthurth > alpine:v.1.1_with_1.txt.tar

导入镜像

docker load < alpine:v.1.1_with_1.txt.tar

docker tag 4243tfdghfdg gao01/alpine:v.1.1_with_1.txt (因为导入没有标签)

docker run --rm -ti --name myalpine_with_1.txtgao/alpine:v1.1_with_1.txt /bin/sh

查看容器日志

docker logs 34552df35

docker logs -f 34552df35 (类似tail -f )

常用命令

映射端口

●docker run -p容器外端口:容器内端口

docker run --rm --name mynginx -d -p81:80 gao01/nginx:v1.12.2

挂载数据卷

●docker run -V容器外目录:容器内目录

mkdir html

wget www.baidu.com -O index.html

docker run -d --rm --name nginx_with_baidu -d -p82:80 -v /root/html:/usr/share/nginx/html gao01/nginx:v1.12.2

docker inspect 8c440bed2ccb 容器运行的细节

传递环境变量

●docker run - e环境变量key=环境变量value

docker run --rm -e E_OPTS=abcdefg oldboy1103/alpine:latest printenv

打印容器中环境变量就删除

●容器内安装软件(工具).
, yum/apt-get/apt等

redhat /ubuntu,debian/alpine

16 高级 后半段

容器的生命周期

镜像是基于容器实例化出来的,借鉴了面向对象的编程方法

●检查本地是否存在镜像,如果不存在即从远端仓库检索
●利用镜像启动容器
●分配一个文件系统,并在只读的镜像层外挂载一层可读写层
●从宿主机配置 的网桥(docker0)接口中桥接一个虚拟接口到容器
●从地址池配置一个ip地址给容器
●执行用户指定的指令执行完毕后容器终止

docker 镜像制做的途径

docker commit

dockerfile

注意:

为注释

指令为大写 内容为小写

docker是按顺序执行Dockerfile里的指令集合(从上到下)

每个Dockerfile的第一个非注释行指令必须是FROM指令

FROM  基础镜像
RUN   制作镜像过程中需要的执行命令(安装服务)
CMD   容器启动的时候执行的初始命令,容易被替换(启动服务)
ENTRYPOINT  容器启动的时候执行的初始命令,不能被替换,如果同时使用CMD和ENTRYPOINT,cmd命令将作为ENTRYPOINT命令的参数
ADD   1.把dockerfile当前目录下的文件拷贝到容器中(自动解压tar包)
ADD  2. http://example.com/big.tar.xz /usr/src/things/  从 url 拷贝文件到镜像中
COPY  把dockerfile当前目录下的文件拷贝到容器中(不解压tar包) 下面有解释
WORKDIR 指定容器的默认工作目录
EXPOSE  镜像要暴露的端口
VOLUME  持久化卷
ENV     环境变量(ssh的密码,数据库的密码)
LABEL       镜像的属性标签
MAINTAINER  管理者标识

注意:

Dockerfile中每一个指令都会建立一层,RUN也不例外。多少个RUN就构建了多少层镜像,多个RUN会产生非常臃肿、多层的镜像,不仅仅增加了构建部署的时间,还容易出错。我们在写Dockerfile的时候,要尽量避免使用多个RUN,尽量将需要执行的命令都写在一个RUN里。多条命令可使用\来换行,换行的命令前面加上&&,最后还需要将不需要的文件及目录删除,比如安装包、临时目录等,减少容器的大小。
注:Union FS是有最大层数限制的,比如AUFS,曾经是最大不得超过42层,现在是不得超过127层。

ADD 从 url 拷贝文件到镜像中
这是一个更加酷炫的用法!但是在 docker 官方文档的最佳实践中却强烈建议不要这么用!!docker 官方建议我们当需要从远程复制文件时,最好使用 curl 或 wget 命令来代替 ADD 命令。原因是,当使用 ADD 命令时,会创建更多的镜像层,当然镜像的 size 也会更大(下面的两段代码来自 docker 官方文档):

ADD http://example.com/big.tar.xz /usr/src/things/
RUN tar -xJf /usr/src/things/big.tar.xz -C /usr/src/things
RUN make -C /usr/src/things all

如果使用下面的命令,不仅镜像的层数减少,而且镜像中也不包含 big.tar.xz 文件:

RUN mkdir -p /usr/src/things \
    && curl -SL http://example.com/big.tar.xz \
    | tar -xJC /usr/src/things \
    && make -C /usr/src/things all

加速镜像构建

将有变化的放在文件最后,尽量使用前面build产生的缓存.

4组核心的Dockerfile指令

●USER/WORKDIR指令

/data/dockerfile/Dockerfile 
FROM  jiajun/nginx:v1.12.1
USER nginx   ##容器进程使用用nginx用户启动
WORKDIR  /usr/share/nginx/html
构建 
dockerfile]# docker build  . -t    docker.io/gao01/nginx:v1.12.1_with_user_workdir(标签)
docker run -it --rm --name nginx  gao01/nginx:v1.12.1_with_user_workdir  /bin/bash
nginx@149ac8f528cc:/usr/share/nginx/html$ whoami
nginx
nginx@149ac8f528cc:/usr/share/nginx/html$ pwd
/usr/share/nginx/html

●ADD/EXPOSE指令

FROM stanleyws/nginx:v1.12.2
ADD index.html /usr/share/nginx/html/index.html
EXPOSE 80   ##配合 -P  -p(小) 指定端口就不会执行EXPOSE

dockerfile]# docker build . -t gao01/nginx:v1.12.2_with_index_expose
dockerfile]# docker run --rm -d --name nginx -P gao01/nginx:v1.12.2_with_index_expose /bin/bash

●RUN/ENV指令

FROM centos:7
ENV VER 9.11.4
RUN yum install bind-$VER -y
dockerfile]# docker build . -t gao01/bind:v9.11.4_with_env_run

●CMD/ENTRYPOINT指令

FROM centos:7
RUN yum install httpd -y
CMD ["httpd","-D","FOREGROUND"]
dockerfile]# docker build . -t gao01/httpd:test

FROM centos:7
ADD entrypoint.sh /entrypoint.sh
RUN yum install epel-release -q -y && yum install nginx -y   -q 不显示安装的过程
ENTRYPOINT /entrypoint.sh

#!/bin/bash
/sbin/nginx -g "daemon off;"
dockerfile]# docker run --rm -p84:80 oldboy1103/nginx:mynginx

小综合:

FROM gao01/nginx:v1.12.2
USER root
ENV WWW /usr/share/nginx/html
ENV CONF /etc/nginx/conf.d
RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime &&\ 
    echo 'Asia/Shanghai' >/etc/timezone
WORKDIR $WWW
ADD index.html $WWW/index.html
ADD demo.od.com.conf $CONF/demo.od.com.conf
EXPOSE 80
CMD ["nginx","-g","daemon off;"]

dockerfile]# vi demo.od.com.conf

server {
   listen 80;
   server_name demo.od.com;

   root /usr/share/nginx/html;
}

dockerfile]# docker run -ti --rm --name lhwl2 --net=container:d62807b4af37 gao01/nginx:curl /bin/bash

docker 网络模型

默认 NAT

[root@docker ~]# docker run -ti --rm myalpine /bin/sh
/#ip add
1: 1o: <LOOPBACK,UP,LOMER _UP> mtu 65536 qdisc noqueue state UNIKNIOMNI qlen 1e00
1ink/loopback 0:00:00:00:00:00 brd 00:00 :00:00:00:00
inet 127.0.0.1/8 scope host 1o
valid_ lft forever preferred. lft forever
204: ethe@if205: <BROADdAST,MULTICAST,UP,LONER _UP,M-DOMN) ntu 1500 qdisc noqueue state UP
link/ether 02:42:aC:07:05:06 brd 4f:ff:ff:ff:4F:ff
inet 172.7.5.6/24 brd 172.7.5.255 scope global ethe
valid_ lft forever preferred_ lft forever

None 不提供网络端口 只落盘,只用计算 存储资源

[ root#docker~]# docker run -t --rm --net=none myalpine /bin/sh
/ # ip add
1: lo: <L0OPBACK UP,LOMER UP> ntu 65536 qdisc noquue state UNKONOMN qlen 1000
link/loopback 00: 00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.8.0.1/8 scope host lo
val1d 1ft forever preferred lft forever

host

[root@docker ~]# docker run -ti --rm --net=host myalpine /bin/sh
/#ip add
1: 1o: <LOOPBACK,UP,LOMER_ UP> ntu 65536 qdisc noqueue state UNKONOMIN qlen 1000
1ink/loopback ee:80:00:88:88:00 brd ee:ee:00:00:e:e0
Inet 127.0.0.1/8 scope host 10
valid_ 1ft forever preferred. _Ift forever
Inet6 ::1/128 scope host
valld_ 1ft forever preferred_ 1ft forever
2: eth0: <BROADCAST,HULTICAST,UP,LOWER UP) ntu 1500 qdisc mq state UP qlen 1000
1ink/ether 00:15:5d:2d:54:02 brd ff:ff:ff:ff:ff:ff
inet 10.4.7.5/24 brd 10.4.7.255 scope global ethe
valld_ 1ft forever preferred_ 1ft forever
inet6 fe8e::1ac7:8272:7cf7:a49C/64 scope link
valid_ Ift forever preferred. _Ift forever
3: dockere: CNO-CARRIER, BROADCAST,HULTICAST,UP> ntu 1500 qdisc noqueue state DOMIN
l1nk/ether 02:42:31:67:ed:9d brd ff:ff:ff:ff:ff:ff
inet 172.7.5.1/24 brd 172.7.5.255 scope global dockere
valld_ 1ft forever preferred_ Ift forever
inet6 fe8e: :42:31ff:fe67:ed9d/64 scope link
valld_ lft forever preferred, lft forever

联合网络(共享网络名称空间)

例;dockerfile]# docker run -ti --rm --name lhwl2 --net=container:d62807b4af37 gao01/nginx:curl /bin/bash

[rootpdocker ~]" docker run -d stanleyws/nginx:y1.12.2
1b18e7b1dcd4f629af234ffbd9fed703cdb8b8a5163feaf2c43113f26d278b4
[rootedocker ~]# docker ps -a
CONTAINER ID
IMAGE
COPWAND
CREATED
1b18e7b1dcd4
stanleyws/nginx:v1.12.2 "nginx 一g'daemon of??
About a minute ago

[root@docker ~]# docker run -ti --rm --net-container:1b18e7b1 stanleyws/nginx:curl bash

root@1b18e7b1dcd4:/# curl localhost
<IDOCTYPE html>
<html>
<head>
<title>helcome to nginxl</title>
<style>
body (
width: 35em;
margin:❼auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
</style>
</head>
<body>
<h1>elcome to nginx!</h1>
<p>If you see this page, the ngInx web server 1s successfully installed and

为什么MySQL不用docker

不能为了用docker而用docker ,不能为了用k8s而用k8s

什么业务决定技术选型

k8s 编排适合没有状态的服务

互联网三次飞跃

1 c/s 架构 --> b/s 架构

2 移动互联网 手机 pad

3 小程序

使用Docker容器化封装应用程序的意义(好处)

●Docker引擎统一 了基础设施环境- docker环境
● 硬件的配置
● 操作系统的版本
, ● 运行时环境的异构
●Docker引擎统一 了程序打包(装箱)方式- docker镜像
●java程序
●python程序
●nodejs程序
●Docker引擎统一 了程序部署(运行)方式- docker容器
●java -jar ... > docker run ...
●python manage.py runserver ... > docker run ...
●npm run dev > docker run ...

使用Docker容器化封装应用程序的缺点(坏处)

●单机使用,无法有效集群
●随着容器数量的上升 ,管理成本攀升
●没有有效的容灾/自愈机制
●没有预设编排模板,无法实现快速、大规模容器调度
●没有统一的配置管理中心工具
●没有容器生命周期的管理工具
●没有图形化运维管理工具

因此我们需要一套容器编排的工具!

基于Docker容器引擎的开源容器编排工具目前市场上主要有:
docker compose(官方出的基于docker引擎单机编排工具)、docker swarm
●Mesosphere +Marathon 15挺火
●Kubernetes ( K8S ) 14谷歌开源了

posted @ 2020-06-08 08:58  gaojiajun  阅读(190)  评论(0)    收藏  举报