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谷歌开源了

浙公网安备 33010602011771号