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
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镜像
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"
作者:华王
博客:https://www.cnblogs.com/huahuawang/