2019-05-22 docker day1

1.docker容器

1:什么是容器?
容器就是在隔离的环境运行的一个进程,如果进程停止,容器就会销毁。隔离的环境拥有自己的系统文件,ip地址,主机名等

kvm虚拟机,linux,系统文件

程序:代码,命令
进程:正在运行的程序
2:容器和虚拟化的区别
linux容器技术,容器虚拟化和kvm虚拟化的区别
kvm虚拟化: 需要硬件的支持,需要模拟硬件,可以运行不同的操作系统,启动时间分钟级(开机启动流程)
3.容器启动流程:
共用宿主机内核:
第一个进程,服务nginx,httpd,mysql


容器:共用宿主机内核,容器的第一个进程直接运行服务,轻量级,损耗少,启动快,性能高

容器虚拟化:不需要硬件的支持。不需要模拟硬件,共用宿主机的内核,启动时间秒级(没有开机启动流程)

总结:
(1)与宿主机使用同一个内核,性能损耗小;
(2)不需要指令级模拟;
(3)容器可以在CPU核心的本地运行指令,不需要任何专门的解释机制;
(4)避免了准虚拟化和系统调用替换中的复杂性;
(5)轻量级隔离,在隔离的同时还提供共享机制,以实现容器与宿主机的资源共享。

Docker是通过进程虚拟化技术(namespaces及cgroups cpu、内存、磁盘io等)来提供容器的资源隔离与安全保障等。由于Docker通过操作系统层的虚拟化实现隔离,所以Docker容器在运行时,不需要类似虚拟机(VM)额外的操作系统开销,提高资源利用率。
namespace  资源隔离
cgroups    进程的资源限制
kvm       虚拟磁盘文件,资源隔离
kvm       资源限制,--cpus --memory

2 docker介绍

docker的主要目标是"Build,Ship and Run any App,Angwhere",构建,运输,处处运行
部署服务,环境问题
一次构建,处处运行
docker是一种软件的打包技术

构建:做一个docker镜像
运输:docker pull
运行:启动一个容器
每一个容器,他都有自己的系统文件rootfs.

kvm解决了硬件和操作系统之间的依赖
kvm独立的虚拟磁盘,xml配置文件

docker解决了软件和操作系统环境之间的依赖,能够让独立服务或应用程序在不同的环境中,得到相同的运行结果。
docker镜像有自己的文件系统。

docker容器是一种轻量级、可移植、自包含的软件打包技术,使应用程序可以在几乎任何地方以相同的方式运行。开发人员在自己笔记本上创建并测试好的容器,无需任何修改就能够在生产系统的虚拟机、物理服务器或公有云主机上运行。

3:docker的安装

10.0.0.11:修改主机名和host解析
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.ustc.edu.cn/docker-ce/linux/centos/docker-ce.repo
sed -i 's#download.docker.com#mirrors.tuna.tsinghua.edu.cn/docker-ce#g' /etc/yum.repos.d/docker-ce.repo
yum install docker-ce -y
[root@docker01 ~]# docker version   安装成功
Client:
 Version:           18.09.6
 API version:       1.39
 Go version:        go1.10.8
 Git commit:        481bc77156
 Built:             Sat May  4 02:34:58 2019
 OS/Arch:           linux/amd64
 Experimental:      false
systemctl start docker  开启docker服务  
docker version  测试服务端已开启

第二种安装方式
[root@docker02 ~]# ll
total 66220
-rw-------. 1 root root     1448 Aug  9  2018 anaconda-ks.cfg
-rw-r--r--  1 root root 67802528 May 22 10:54 docker_rpm.tar_(2).gz
[root@docker02 ~]# tar xf docker_rpm.tar_\(2\).gz 
[root@docker02 ~]# ll
total 66224
drwxr-xr-x  2 root root     4096 May 22 10:42 docker_rpm
-rw-r--r--  1 root root 67802528 May 22 10:54 docker_rpm.tar_(2).gz
[root@docker02 ~]# rpm -Uvh docker_rpm/*.rpm

已下载docker 安装包
docker_rpm.tar_(2).gz包  上传
tar xf docker_rpm.tar_\(2\).gz 
 rpm -Uvh docker_rpm/*.rpm   升级安装   (前提环境要一致才能安装成功)

4. docker 日常命令

docker info    显示docker详细信息(如果要做监控)
docker system df  显示docker占用系统信息(如果要做监控)
docker主要组件有:镜像、容器、仓库, 网络,存储

启动容器必须需要一个镜像,仓库中只存储镜像
容器---镜像---仓库

5.启动第一个容器

##配置docker镜像加速
vi /etc/docker/daemon.json
{
  "registry-mirrors": ["https://registry.docker-cn.com"]
}   

docker run -d -p 80:80 nginx

wget http://192.168.21.15/docker_nginx1.15.tar.gz   下载镜像
docker image load -i docker_nginx1.15.tar.gz   导入镜像
run(创建并运行一个容器)
-d 放在后台
-p 端口映射
nginx docker镜像的名字

6:docker的镜像管理参数

docker search  搜索镜像
docker pull(push)获取镜像
官方pull      docker pull centos:6.8(没有指定版本,默认会下载最新版)
私有仓库pull    docker pull daocloud.io/huangzhichong/alpine-cn:latest 
    
docker images  查看镜像列表
docker image  ls 查看镜像列表
docker rmi   删除镜像   例子:docker image rm centos:latest 
docker save 导出镜像  例子:docker image save busybox:latest -o docker_busybox.tar.gz
docker image load -i 镜像压缩包文件  导入镜像    
例子:docker image load -i docker_busybox.tar.gz

7. docker的容器管理

docker run -d -p 80:80 nginx:latest  
run(创建并运行一个容器)
-d 放在后台
-p 端口映射
--rm 容器退出后自动被删除
-v  源地址(宿主机):目标地址(容器)

nginx docker镜像的名字

docker run -it --name centos6 centos:6.9 /bin/bash
-it   分配交互式的终端
--name 指定容器的名字
/bin/sh覆盖容器的初始命令

启动容器***
    docker run image_name
    docker run -it image_name CMD
    
    docker run ==== docker create  + docker start
docker stop  停止容器
docker kill 杀死容器
查看容器列表
 docker ps       查看正在运行的容器
    docker ps –a    查看所有的容器
    dockers ps -a -l  显示最新的容器
    dockers ps -a -l --no-trunc  显示id容器长格式  
进入容器(目的,调试,排错)
docker exec  (会分配一个新的终端tty) 
docker exec -it  容器id或容器名字 /bin/bash(/bin/sh)
docker attach(使用同一个终端)      
docker rm `docker ps -a -q`   删除退出的容器
docker rm -f `docker ps -a -q`   批量强制删除包括正在运行的容器
docker commit  把容器提交为镜像
docker cp     在容器和宿主机之间拷贝文件
docker logs   查看容器终端输出日志
docker restart 重启容器 
总结:docker容器内的第一个进程(初始命令)必须一直处于前台运行的状态(必须夯住),否则这个容器,就会处于退出状态!

业务在容器中运行:夯住,启动服务

cat /etc/apt/sources.list  debian源的位置

echo 'deb http://mirrors.163.com/debian/ stretch main non-free contrib
deb http://mirrors.163.com/debian/ stretch-updates main non-free contrib
deb http://mirrors.163.com/debian/ stretch-backports main non-free contrib
deb-src http://mirrors.163.com/debian/ stretch main non-free contrib
deb-src http://mirrors.163.com/debian/ stretch-updates main non-free contrib
deb-src http://mirrors.163.com/debian/ stretch-backports main non-free contrib
deb http://mirrors.163.com/debian-security/ stretch/updates main non-free contrib
deb-src http://mirrors.163.com/debian-security/ stretch/updates main non-free contrib' >/etc/apt/sources.list

apt-get update   更新源
apt-get install procps -y  安装ps 命令

8:docker容器的网络访问(端口映射)

指定映射(docker 会自动添加一条iptables规则来实现端口映射)
    -p hostPort:containerPort
    -p ip:hostPort:containerPort  多个容器都想使用80端口
    -p ip::containerPort(随机端口)
    -p hostPort:containerPort:udp
    -p  10.0.0.100::53:udp
    -p 81:80 –p 443:443 可以指定多个-p
    
ifconfig eth0:0  10.0.0.200/24 up 添加ip地址   一个网卡可以指定多个ip地址

随机映射     docker run -P (随机端口)
通过iptables来实现的端口映射

vim /etc/sysctl.conf   永久内核转发配置
sysctl net.ipv4.ip_forward = 1  

9:docker的数据卷管理

/usr/share/nginx/html

-v  /opt/xiaoniao:/usr/share/nginx/html

持久化
数据卷(文件或目录)
    -v 卷名:/data
    -v src(宿主机的目录):dst(容器的目录)
数据卷容器
    --volumes-from(跟某一个已经存在的容器挂载相同的卷)
2.docker run -it -v /宿主机的目录:/容器的目录  镜像名 
基于nginx启动一个容器,监听80和81,访问80,出现nginx默认欢迎首页,访问81,出现小鸟。
-p 80:80 -p 81:81 -v  xxx:xxx -v  xxx:xxxx
基于nginx多端口的多站点。 

3.容器停止退出后,主机修改后数据内容同步
exit 命令 退出容器  
4.命令(带权限)   
docker run -it -v /宿主机的目录:/容器的目录:ro  镜像名

11:手动将容器保存为镜像

docker commit 容器id或者容器的名字   新的镜像名字[:版本号可选]

1):基于容器制作镜像
docker run -it centos:6.9 
######
yum install httpd
yum install openssh-server
/etc/init.d/sshd start

vi /init.sh
#!/bin/bash
/etc/init.d/httpd start
/usr/sbin/sshd -D

chmod +x /init.sh

2)将容器提交为镜像
docker commit oldboy centos6-ssh-httpd:v1

3)测试镜像功能是否可用

手动制作的镜像,传输时间长
镜像初始命令

docker run -it -p 1022:22 centos:6.9
echo " 192.168.21.15  mirrors.aliyun.com" >>/etc/hosts
curl -o /etc/yum.repos.d/CentOS-Base.repo  http://mirrors.aliyun.com/repo/Centos-6.repo
yum install openssh-server -y
service sshd start
echo "123456"|passwd --stdin root
安装好服务的容器提交镜像
docker commit id号 centos6.9_ssh:v1
测试镜像功能是否正常
docker run -d -p 1024:22 centos6.9_ssh:v1 /usr/sbin/sshd -D

制作一个kodexplorer网盘docker镜像。nginx + php-fpm(httpd + php)

12.自动构建镜像

12.1自动构建docker镜像:

1)手动制作docker镜像

2)写dockerfile文件
vim dockerfile
FROM centos:6.9
RUN curl -o /etc/yum.repos.d/CentOS-Base.repo  http://mirrors.aliyun.com/repo/Centos-6.repo
RUN yum install openssh-server -y
RUN service sshd start
RUN echo "123456"|passwd --stdin root
CMD ["/usr/sbin/sshd","-D"]
3)构建镜像
docker build --network=host -t centos6.9_ssh:v2 .

4)测试镜像的功能
docker run -d -p 3333:22 centos6.9_ssh:v2

12.2#dockerfile内容基础知识

1.每条保留字指令必须为大写字母且后面至少跟随一个参数
2.指令按照从上到下,依次按顺序执行
3.#表示注释
4.每条指令创建一个新的镜像层,并对镜像进行提交

12.3#dockerfile体系结构常用指令

1.FROM  基础镜像,当前新镜像是基于哪个镜像的
2.MAINTAINER 镜像维护者的姓名和邮箱地址
3.RUN 容器构建时需要运行的命令
4.EXPOSE 当前容器对外暴露出的端口
5.WORKDIR 指定在创建容器后,终端默认登录时进来的工作目录
6.ENV 用来在构建镜像过程中设置环境变量
7.ADD  将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理url和解压tar压缩包
8.COPY 类似ADD ,拷贝文件和目录到镜像中,不会解压
9.VOLUME  容器数据卷,用于数据保存和持久化工作
10.CMD 指定一个容器启动时要运行的命令
dockerfile 中可以有多个CMD 指令,但只有最后一个生效,CMD会被docker run 之后的参数替换
11.EMTRYPOINT 指定一个容器启动时要运行的命令   ,默认追加不会覆盖
12.ONBUILD 当构建一个被继承的dockerfile时运行命令,父镜像在被子镜像后父镜像的onbuild被触发

13.案例 手工制作一个discuz论坛 ,lnmp架构


echo "192.168.21.15 mirrors.aliyun.com" >>/etc/hosts
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo
yum install nginx php-fpm -y

vi default.conf
server {
    listen       80 ;
    server_name  localhost;
    root         /code;
    index   index.php index.html index.htm;
    location / {
    }
    location ~ \.php$ {
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  /code$fastcgi_script_name;
            include        fastcgi_params;
        }
}
nginx -t
service nginx restart
mkdir /code
vi /etc/php-fpm.d/www.conf 
service php-fpm start

测试php环境
[root@5026b23ed92d code]# cat info.php 
<?php phpinfo(); ?>
http://10.0.0.11/info.php
wget http://192.168.21.15/Discuz_X3.4_SC_UTF8_0802.zip
unzip Discuz_X3.4_SC_UTF8_0802.zip 
mv upload/* .
chown -R nginx.nginx *
yum list|grep php|grep gd
yum install php-gd.x86_64  y
service php-fpm restart
yum install php-mysql
service php-fpm restart
yum install mysql-server -y
service mysqld start
mysqladmin -uroot password '123456'

docker commit 5026b23ed92d discuz:v1  提交镜像

vim init.sh  服务启动脚本
#!/bin/sh
service php-fpm start
service mysqld start
sevvice nginx start
/usr/sbin/sshd -D    最后一个服务夯住  tail -f  
docker commit 99e5cd21fb52  discuz:v2
docker run -d -p 80:80 -p 1022:22 discuz:v2 /bin/bash /init.sh    进行测试

yum install php-mysql mysql-server  -y
service php-fpm restart
service mysqld start

grep -Ev '^$|#' /etc/nginx/nginx.conf.default >/etc/nginx/nginx.conf
vim /etc/nginx/nginx.conf
worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    server {
    listen       80 ;
    server_name  localhost;
    root         /code;
    index   index.php index.html index.htm;
    location / {
    }
    location ~ \.php$ {
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  /code$fastcgi_script_name;
            include        fastcgi_params;
        }
}
}

上周内容回顾

1:什么是容器?
容器是在隔离的环境中运行的一个进程。
容器是一个软件的打包技术。

2:容器相对于虚拟机有什么优势?
轻量级,损耗少,性能高,启动快

3:镜像常用的命令
docker search 搜索镜像
docker image ls 查看镜像列表
docker image rm 删除镜像
docker image save 导出镜像
docker image load 导入镜像
docker image pull 拉取镜像
docker image push 上传镜像
docker image build 构建镜像
docker image histroy查看镜像构建历史命令
docker image prune批量清除未使用的镜像
docker image tag  给镜像打标签

4:容器常用的命令
docker run创建并启动一个容器
docker exec  进入容器(新的终端)
docker attach进入容器(共用一个终端)
docker rm     删除容器
docker create 创建容器
docker start  启动容器
docker stop   关闭容器
docker kill   杀死容器
docker restart 重启容器
docker ps  -a   查看容器
docker commit   把容器提交为镜像
docker logs     查看容器初始命令的输出结果
docker cp       在容器和宿主机之间拷贝文件
docker inspect  查看容器的详细属性

docker run的参数
-d  在后台运行
--name 容器的名字
-it    分配一个交互式的终端
-p     端口映射
-P     随机端口映射(EXPOSE)
-v     挂载目录或卷到容器中
-e     指定环境变量
--rm   容器退出自动删除
--link 容器间互联(单向) /etc/hosts
--network 基于制定的网络运行容器
--restart=always 容器的开机自启
-h      指定容器的主机名

dockerfile常用指令?
RUN
ADD
FROM
CMD   容易被覆盖
EXPOSE
ENV
COPY
WORKDIR
VOLUME
ENTRYPOINT不会被覆盖

docker的私有仓库
上传镜像2步
a:给镜像打标签
docker image tag  centos6.9_ssh:v2  [图片上传失败...(image-a04c2e-1558919647135)]

10.0.0.11:5000/centos6.9_ssh:v2
docker push [图片上传失败...(image-bf9dc7-1558919647135)]

10.0.0.11:5000/centos6.9_ssh:v2

docker login [图片上传失败...(image-29ed02-1558919647135)]

10.0.0.11:5000
docker logout [图片上传失败...(image-14f498-1558919647135)]

10.0.0.11:5000

docker 四种网络模式
none  没有网络
host  与宿主机共用网络
container 与已运行的容器共用网络
bridge  

macvlan
overlay

pipework
flannel

docker-compose 单机版容器编排工具

容器编排,k8s

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,544评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,430评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,764评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,193评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,216评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,182评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,063评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,917评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,329评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,543评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,722评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,425评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,019评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,671评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,825评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,729评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,614评论 2 353