8 docker

docker学习

常用命令

1 docker pull ansible/centos7-ansible #拉取centos镜像
2 docker run -it -p 1662:1662 -p 9200:9200 --name=thinnjs01 ansible/centos7-ansible /bin/bash #交互式运行
  docker run -d -p 1662:1662 -p 9200:9200 --name=thinnjs01 ansible/centos7-ansible /bin/bash #后台启动
3 docker exec -it edc6863752b2  bash # 进入容器
4 docker cp ./ThingJS-X_Installer_3.4.0 edc6863752b2:/root/   # cp宿主机下文件夹到容器指定位置
5 docker info  #查看docker相关信息
6 修改docker存储位置
  vim /etc/docker/daemon.json
    {"graph":"/data/docker"}  #添加存储根路径
 systemctl restart docker #重启docker
  docker info  #查看 Docker Root Dir
7 docker inspect ee3c(容器id) #查看容器相关信息  
8 docker stats 容器id # 查看容器的cpu内存和网络状态
 

本地开发环境--快速开发新功能---django2---等等新的模块

测试环境---测试代码

预生产环境---和线上服务器环境一模一样

线上环境服务器---部署代码

整个环境部署的问题,非常棘手,因此引入了容器技术,唰的一下,全部解决了

解决环境迁移的难题

1.利用虚拟机的模板克隆功能,将整个机器的环境复制一份,再丢给第二个机器去使用

2.最好是使用docker去部署环境

docker的生命周期概念

  • 镜像,是一个系统的只读模板,例如一个微型的centos系统镜像
  • 容器,容器进程,应用程序以后封装在容器中去运行,相互隔离
  • 仓库,存储镜像的一个仓库地址,便于和他人共享镜像文件的一个地方
基于镜像运行处容器
基于一个镜像,可以运行处N多个容器实例

以python的面向对象去理解的话

docker的镜像---------理解为python的 class
docker的容器-------理解为class的实例化对象

class  Stu():
	 def __init__(self):
	 			self.age=18
	 			self.height=180
	 			self.weight=280

老王=Stu()
小李=Stu()
小张=Stu()

问,老王,小李,小张之间有什么相同性吗? 这3个对象,都有相同的Init里面的实例化属性 

基于如上的概念理解,基于同一个镜像文件,运行出的容器实例,其容器内的环境,也是一模一样的!理解一下


安装docker,使用docker

使用阿里云的yum源,可以直接安装docker软件,阿里云的docker软件版本可能较低,如果要下载新的,去docker官网找

1.yum install docker -y 

2.配置docker的镜像加速器,加速系统镜像的下载,默认是去国外下载,比较慢
能够加速下载你所需要的各种镜像,来自如如下提供的2个镜像站点
比如你想快速的使用tornado模块去开发一些东西
-编译安装python3
-安装tornado模块及依赖关系
-加上你的代码才能够运行 

当你有了docker技术
docker search  tornado  #直接搜索和tornado有关的镜像,是其他人制作好的镜像
docker pull tornado  #直接下载该镜像,和代码结合使用,docker解决了,省去了你配置环境的一些步骤


vim /etc/docker/daemon.json  #修改docker的配置文件,修改docker镜像的下载地址,在国内下载比较快
{
 "registry-mirrors": ["https://b9pmyelo.mirror.aliyuncs.com"]
}


3.重启docker,运行docker
systemctl restart docker 

4.获取一个centos的基础镜像,docker的系统镜像,非常小, centos只有200M左右
docker pull centos

学习docker容器、镜像的增删改查命令

1.查看镜像
docker  images 

2.查看正在运行的的容器
docker ps 

3.查看所有运行,以及挂掉的容器进程
docker ps -a  

4.查看容器内的运行日志
docker logs  容器id
docker logs -f  容器id   #实时刷新容器内的日志,例如检测nginx等日志信息

5.查看容器内的端口转发情况
docker port  容器id  #查看容器的端口转发
[root@s25linux ~]# docker port 615  
5000/tcp -> 0.0.0.0:6000

6.搜索相关的镜像
docker search  python3 

7.查看容器内部 ip
--# 进入容器内部查看
docker exect -it 02277acc3efc bash 
cat /etc/hosts

--# 宿主机查看
docker inspect 02277acc3efc

1.从dockerhub 仓库中获取docker的镜像,从github获取代码一个道理
docker  pull centos  #去docker仓库中寻找centos系统镜像
docker  pull  ubuntu  #获取ubuntu镜像

2.获取一个hello-world进程
docker  pull hello-world

3.获取一个ubuntu镜像
docker pull ubuntu  

4.搜索相关的镜像
docker search  python3 

#比如你想用nginx,又不想修改宿主机的一个软件环境,直接用docker安装
docker search  nginx 
docker pull nginx
docker run nginx  #nginx服务器就能够运行在容器中,然后和宿主机有一个端口映射,就可以访问了

5.交互式的运行一个存活的docker容器,centos
docker run -it  centos  /bin/bash 	#运行centos镜像,且进入容器内
	- [root@s25linux ~]# docker run  -it  centos  /bin/bash		#进入容器后,容器空间内是以容器id命名的
	- [root@fc760671d074 /]#
exit # 退出容器,回到宿主机器

1.删除本地镜像文件
docker rmi   镜像id
docker rmi  fce  #删除镜像id的前3位即可,必须要先删除有相关依赖的容器进程记录

2.删除容器记录的命令
docker rm   容器id前3位 

3.批量清空无用的docker容器记录,容器记录非常容易创建docke run  
#批量删除挂掉的容器记录
docker rm  `docker ps -aq`  #  把docker容器记录的id号,保存在反引号中,丢给docker rm实现批量删除

4.批量删除镜像
docker rmi `docker iamges -aq`

5.批量停止容器
docker stop `docker ps -aq`
docker start 容器id #启动暂停的容器
docker stop 容器id  #暂停一个容器
docker restart 容器id  #重启容器

改(进入容器-->生成新的镜像)

1.运行第一个docker的容器实例,运行镜像文件,产生容器进程
docker run   镜像文件的名字即可
docker run  centos  #运行centos基础镜像,如果docker容器中没有在后台运行的进程,容器会直接挂掉
#如果你发现你的容器没有启动成功,说明容器内部出错了,程序没有运行

2.运行一个hello world容器进程
docker run hello-world

3.docker run指令还有一个功能是,当镜像不存在的时候,会自动去下载该进程
此时老师的电脑,本地没有hello-world镜像了
docker run hello-world   #有2个功能,下载镜像,执行镜像

4.交互式的运行一个存活的docker容器,centos

# -it参数  -i 是交互式的命令操作   -t开启一个终端   /bin/bash 指定shell解释器
# 容器空间内,有自己的文件系统 
docker run -it  centos  /bin/bash 	#运行centos镜像,且进入容器内
[root@s25linux ~]# docker run  -it  centos  /bin/bash		#进入容器后,容器空间内是以容器id命名的
[root@fc760671d074 /]#
exit # 退出容器,回到宿主机器

5.运行出一个活着的容器,在后台不断执行程序的容器
#  docker run  运行镜像文件
#  -d 是让容器后台运行
#  -c 指定一段shell代码

# 运行centos镜像,生成容器实例,且有一段shell代码,在后台不断运行,死循环打印一句话,每秒钟打印一次
docker run -d centos /bin/sh -c "while true;do echo s25的靓仔们辛苦了学习linux; sleep 1;done"

6.运行docker容器,且指定名字,便于管理
docker run --name "指定容器的运行名字“    -d centos /bin/sh -c "while true;do echo s25的靓仔们辛苦了学习linux; sleep 1;done"

7.进入一个正在运行的容器空间,进入一个线上正在运行的容器程序,修改其内部的资料
docker exec -it  容器id   /bin/bash  

8.如何进入容器空间内,修改容器内的环境,以及代码等内容,修改软件等操作,且提交镜像,发送给其他人
8.1 进入容器空间内,安装一个vim或是python3等步骤
docker run -it centos /bin/bash
yum install vim -y 

8.2  安装好vim后,退出容器空间
exit

8.3 提交该容器,生成新的镜像文件
docker commit  5b28d8c88794  s25-centos-vim

9.导出你的docker镜像,可以发送给同事,或是其他人使用
docker save  镜像id   >   镜像的压缩文件
#官方文档解释的是,docker save用的是tar命令压缩,应该是没有其他压缩格式的
[root@s25linux ~]# docker save  45d7f887125d   >   /opt/s25-centos-vim.tar.gz
#你可以删掉本地的镜像,然后重新导入该压缩文件,模拟发送给同事的操作

10.如何进行docker镜像导入 
比如小李运维同志,他收到了该docker镜像压缩文件,在他的机器上导入该进项
docker  load   <   /opt/s25-centos-vim.tar.gz
首次导入该进项的时候,发现丢失了镜像tag标签,重新赋予一个即可
docker tag  45d7f887125d  s25-new-centos-vim

11.如何在docker内,运行一个python web的程序,需要用到端口映射知识~~~~
#  -d 后台运行 
# -P  大写的P参数,作用是随机的端口映射
# training/webapp 是镜像的名字,默认没有会去在线下载
# python app.py   代表启动容器后,让容器执行的命令是它
# 因此这个命令作用是,启动一个webapp镜像,且在容器中执行 python app.py  
# -p 6000:5000  访问宿主机的6000,就是访问容器的5000了
docker run --name "s25webdocker"  -d -p 6000:5000 training/webapp python app.py  

12.进入该webapp的容器,查看里面的内容
docker exec -it  容器id   /bin/bash  #进入容器内,可以进行相应的修改操作
docker restart  容器id  #重启该容器,重新读取代码,即可生效


对于后端开发的程序员,只需要掌握Docker的容器,镜像,仓库的增删改查命令即可

dockerfile

手写一个dockerfile,运行出python的应用

dockerfile常用指令学习

# FROM 指令表示,告诉该dockerfile以哪个镜像为基础
# 比如你的技术老大,要求你们程序运行在ubuntu中
# FROM  ubuntu
# FROM  centos
FROM scratch #制作base image 基础镜像,尽量使用官方的image作为base image
FROM centos #使用base image
FROM ubuntu:14.04 #带有tag的base image


#LABEL标签,定义变量,定义坐着信息等
LABEL version=“1.0” #容器元信息,帮助信息,Metadata,类似于代码注释
LABEL maintainer=“yc_uuu@163.com"

#RUN是一个完成指令,你可以用它在docker中执行任意的命令
# RUN就是告诉容器要做哪些配置

# 用RUN指令告诉dockerfile他该去做什么事
RUN mkdir  /s25牛批
RUN cd  /s25牛批
RUN cd
RUN pwd  #会输出什么? 因此在容器中会输出,用户家目录


#对于复杂的RUN命令,避免无用的分层,多条命令用反斜线换行,合成一条命令!
# 要修改centos基础镜像的环境问题
RUN yum update && yum install -y vim \
    Python-dev #反斜线换行
RUN /bin/bash -c "source $HOME/.bashrc;echo $HOME”


# 容器内运行类似linux的cd命令
WORKDIR /root #相当于linux的cd命令,改变目录,尽量使用绝对路径!!!不要用RUN cd
WORKDIR /test #如果没有就自动创建
WORKDIR demo #再进入demo文件夹
RUN pwd     #打印结果应该是/test/demo

#案例
WORKDIR /s25很棒
WORKDIR  我们要说goodbay了
RUN  pwd  #会输出什么? /s25很棒/我们要说goodbay了  此时进入了2层目录


# ADD指令用于添加宿主机的文件,放入到容器空间内 
# 宿主机有自己的文件系统,文件夹,文件,目录等
# 容器内也有一套自己的文件系统,独立的文件信息
# 把宿主机的代码,拷贝到容器内
# ADD还有解压缩的功能,这是一个坑,需要注意
ADD and COPY 
ADD hello.txt /opt  #吧宿主机的hello.txt 拷贝到容器内的/opt目录下 
ADD test.tar.gz /opt    /opt/test  
RUN tar -zxvf test.tar.gz  #直接报错,文件不存在 ,因为上一步,ADD指令已经对tar.gz压缩包解压缩了


WORKDIR /root
ADD hello test/  #进入/root/ 添加hello可执行命令到test目录下,也就是/root/test/hello 一个绝对路径
COPY hello test/  #等同于上述ADD效果

# dockerfile,用于从宿主机拷贝文件,到容器内有2个指令一个ADD,一个COPY,COPY仅仅就是拷贝,尽量用它
ADD与COPY
   - 优先使用COPY命令
    -ADD除了COPY功能还有解压功能

#添加远程文件/目录使用curl或wget

ENV #环境变量,尽可能使用ENV增加可维护性
ENV MYSQL_VERSION 8.0 
RUN yum install -y mysql-server=“${MYSQL_VERSION}” 


RUN yum install -y mysql-server=“${MYSQL_VERSION}” 
RUN yum install -y mysql-server=“${MYSQL_VERSION}” 
RUN yum install -y mysql-server=“${MYSQL_VERSION}” 
RUN yum install -y mysql-server=“${MYSQL_VERSION}” 
RUN yum install -y mysql-server=“${MYSQL_VERSION}” 
RUN yum install -y mysql-server=“${MYSQL_VERSION}” 



dockfile 简单示例

# 设置python环境镜像
FROM python:3.7

#代码添加到code文件夹,code无需新建(docker执行时自建)
ADD . /code/

#设置code文件夹为工作目录
WORKDIR /code

#安装相应的python库
RUN pip install -r requirements.txt

CMD ["python","/code/manage.py","runserver","0.0.0.0:8000"]

dockfile实战,写一个flask容器脚本

构建镜像的步骤

1.准备好一个flask代码,检查需要哪些依赖步骤
[root@s25linux s25docker]# cat s25_flask.py

from flask import Flask
app=Flask(__name__)
@app.route('/')
def hello():
    return "linux就即将结束了,祝大家,找到好工作,有linux问题呢,尽量和我来沟通,互相学习"
if __name__=="__main__":
    app.run(host='0.0.0.0',port=8080)
    
2.在宿主机环境检查如何能够运行该脚本
发现需要安装flask模块
pip3 install -i https://pypi.douban.com/simple flask

3.编写dockerfile脚本,注意名字必须是 大写Dockerfile

touch Dockerfile ,写入如下的内容

FROM python    #指定镜像,dockerhub提供好的python镜像,已经安装好了python3,很好用
RUN pip3 install -i https://pypi.douban.com/simple flask  #在容器内安装flask模块  
ADD  s25_flask.py    /opt	#把宿主机的代码,拷贝到容器的/opt目录下
WORKDIR  /opt		#容器内进行目录切换
EXPOSE 8080		#打开容器的8080端口,用于和宿主机进行映射
CMD ["python3","s25_flask.py"]  	#在容器启动后,内部自动执行的命令是什么 


4.检查准备的脚本代码,以及Dockerfile文件
[root@s25linux s25docker]# ls
Dockerfile  s25_flask.py


5.构建该dockerfile,生成镜像 
[root@s25linux s25docker]# docker build -t nodewebserver . #构建 nodewebserver镜像
#[root@s25linux s25docker]# docker build .

6.检查docker的镜像,是否生成
docker images 
#可以修改一下镜像的标签
#[root@s25linux s25docker]# docker tag  a66  s25-flask

7.构建一个nodeserver容器实例
docker run -p 5000:8000 -p 8022:22 -d --name nodeserver nodewebserver    
#基于刚刚构建的 nodewebserver 镜像 启动一个名为 nodeserver 的容器来 容器8000端口映射宿主的5000端口,容器端口22映射宿主机8022端口

8.访问宿主机端口,查看容器内的应用
curl  127.0.0.1:8000

9.进入容器
docker exec -it  88a  /bin/bash  (88a-->容器id前三位)
修改容器内的代码
sed  -i "s/linux就即将结束了,祝大家,找到好工作,有linux问题呢,尽量和我来沟通,互相学习/linux课程结束,再回!朋友们/"  s25_flask.py

10.重启容器
docker ps  # 查看容器
docker restart 88a(容器id前三位)

11.再次访问容器内应用,查看更新的代码内容
curl  127.0.0.1:8000

经验:
1 docker容器内安装vim
apt-get install vim
image
apt-get update # 获取最新软件包
apt-get install vim # 安装vim

查看docker日志

通过docker logs命令可以查看容器的日志。
命令格式:

$ docker logs [OPTIONS] CONTAINER
  Options:
        --details        显示更多的信息
    -f, --follow         跟踪实时日志
        --since string   显示自某个timestamp之后的日志,或相对时间,如42m(即42分钟)
        --tail string    从日志末尾显示多少行日志, 默认是all
    -t, --timestamps     显示时间戳
        --until string   显示自某个timestamp之前的日志,或相对时间,如42m(即42分钟)

例子

1 查看指定时间后的日志,只显示最后100行:
$ docker logs -f -t --since="2018-02-08" --tail=100 CONTAINER_ID

2 查看最近30分钟的日志:
$ docker logs --since 30m CONTAINER_ID

3 查看某时间之后的日志:
$ docker logs -t --since="2018-02-08T13:23:37" CONTAINER_ID

4 查看某时间段日志:
$ docker logs -t --since="2018-02-08T13:23:37" --until "2018-02-09T12:23:37" CONTAINER_ID

dockerhub仓库

dockerhub仓库就是和github一样的概念

github---托管程序员的代码

dockerhub----托管程序员编写的docker镜像


image


1.docker提供了一个类似于github的仓库dockerhub,
网址https://hub.docker.com/需要注册使用

2.注册docker id-->在linux中登录dockerhub
docker login

2.1准备镜像推送
注意要保证image的tag是dockerhub账户名,如果镜像名字不对,需要改一下tag

docker tag 镜像id  dockerhub的账号/centos-vim
语法是:  docker tag   镜像id   yuchao163/仓库名


3.推送docker image到dockerhub,好比你准备git push 推送代码一样
docker push dockerhub账号/centos-vim

4.在dockerhub中检查镜像,查看个人账户中的镜像文件
https://hub.docker.com/

5.删除本地镜像,测试下载pull 镜像文件
docker pull yuchao163/centos-vim 

yaml配置文件

你用过哪些格式的配置文件?
不同的配置文件,遵循的语法也不一样

  • json------
  • Conf----nginx.conf ,my.cnf
  • ini ------uwsgi.ini
  • Xml----xml格式的配置文件
  • yaml----新式配置文件,用在docker、salt、k8s等配置文件中,遵循python的缩进语法

yaml

语法规则
    大小写敏感
    使用缩进表示层级关系   
    缩进时禁止tab键,只能空格
    缩进的空格数不重要,相同层级的元素左侧对其即可
    # 表示注释行
yaml支持的数据结构
    对象: 键值对,也称作映射 mapping 哈希hashes  字典 dict    冒号表示 key: value   key冒号后必须有
    数组: 一组按次序排列的值,又称为序列sequence  列表list     短横线  - list1
    纯量: 单个不可再分的值
    
    
    对象:键值对

python

python的字典套字典,数据结构表示如下

{
	"s25":{
			"男同学":["宝元","太白","马jj"],
			"女同学":["景女神","alex"]
	}
}

如何用yaml表示上述数据结构呢?
在线yaml解析
https://www.bejson.com/validators/yaml_editor/

"s25":
  "男同学":
     - "宝元"
     - "太白"
     - "马jj"
  "女同学":
       - "景女神"
       - "alex"
posted @ 2021-06-18 23:37  风hua  阅读(57)  评论(0编辑  收藏  举报