【linux】docker

Docker

Docker 是一个开源的应用容器引擎, docker将应用程序与程序的依赖,打包在一个文件里面。运行这个文件就会生成一个虚拟容器。程序运行在虚拟容器里,如同在真实物理机上运行一样,有了docker,就不用担心环境问题了。

docker与虚拟机的区别

特性 容器 虚拟机
启动 秒级 分钟级
硬盘使用 一般为 MB 一般为 GB
性能 接近原生
系统支持量 单机支持上千个容器 一般几十个

docker的应用场景

web应用的自动化打包和发布
自动化测试和持续集成、发布
在服务型环境中部署和调整数据库或其他应用

docker容器的优势

1.更高效的利用系统资源
由于容器不需要进行硬件虚拟以及运行完整操作系统等额外开销,Docker 对系统 资源的利用率更高。
无论是应用执行速度、内存损耗或者文件存储速度,都要比传 统虚拟机技术更高效。因此,相比虚拟机技术,一个相同配置的主机,往往可以运 行更多数量的应用。

2.更快速的启动时间
传统的虚拟机技术启动应用服务往往需要数分钟,而 Docker 容器应用,由于直接 运行于宿主内核,无需启动完整的操作系统,因此可以做到秒级、甚至毫秒级的启 动时间。大大的节约了开发、测试、部署的时间。

3.一致的运行环境
开发过程中一个常见的问题是环境一致性问题。由于开发环境、测试环境、生产环 境不一致,导致有些 bug 并未在开发过程中被发现。
而 Docker 的镜像提供了除内 核外完整的运行时环境,确保了应用运行环境一致性,从而不会再出现 “这段代码 在我机器上没问题啊” 这类问题。

4.更轻松的迁移
由于 Docker 确保了执行环境的一致性,使得应用的迁移更加容易。Docker 可以在 很多平台上运行,无论是物理机、虚拟机、公有云、私有云,甚至是笔记本,其运行结果是一致的。
因此用户可以很轻易的将在一个平台上运行的应用,迁移到另一 个平台上,而不用担心运行环境的变化导致应用无法正常运行的情况。

docker三大概念

docker镜像

Docker镜像就是一个只读的模板。镜像可以用来创建Docker容器。

image的分层存储

因为镜像包含完整的root文件系统,体积是非常庞大的,因此docker在设计时按照Union FS的技术,将其设计为分层存储的架构。
镜像不是ISO那种完整的打包文件,镜像只是一个虚拟的概念,他不是一个完整的文件,而是由一组文件组成,或者多组文件系统联合组成。

docker容器(container)

容器是从镜像创建的运行实例。它可以被启动、开始、停止、删除。每个容器都是相互隔离的,保证安全的平台。

docker仓库(repository)

仓库是集中存放镜像文件的场所。分为公开仓库(Public)和私有仓库(Private)两种形式。

使用Docker

安装docker

yum install docker-server docker -y

检查docker版本

docker version  

启动docker

systemctl start docker

docker镜像加速器

https://www.daocloud.io/mirror#accelerator-doc

在 /etc/docker/daemon.json文件写入如下配置

{"registry-mirrors": ["http://f1361db2.m.daocloud.io"]}

重启docker

systemctl restart docker

docker命令

搜索镜像

docker search  name

下载镜像

docker  pull  name

查看本地所有的镜像

docker image ls

运行镜像,生成容器

docker run 镜像id

删除镜像

# 必须清除所有的容器记录依赖 
docker   rmi 镜像id
#批量删除镜像记录 
docker rmi  `docker images -aq`  

运行容器 ,进入容器空间

docker  run  -it  centos  /bin/bash  
#-i 是交互式的操作
#-t  是开启一个终端

删除容器记录

# 必须是挂掉的记录才能删除 
docker rm 容器id
#批量删除容器记录 
docker  rm  `docker ps -aq`  

更新容器镜像

docker commit  容器id    新的镜像名  

查看正在运行的容器

docker ps 

查看所有运行过的容器

docker ps -a

导出本地docker镜像

docker save  容器id   >  镜像压缩文件

导入docker镜像文件

docker load <   镜像压缩文件 

修改docker镜像名字

docker tag 镜像id    新的镜像名  

后台运行容器

docker run -d --name hello centos /bin/sh -c "while true;do echo hello; sleep 1;done"
# --name 容器名字
# -d 后台运行 
# /bin/sh  Linux的shell解释器
#  -c  指定一段shell脚本 

运行一个web程序,在容器中对外进行端口暴露

docker run -d -p 8090:5000 training/webapp python app.py
# -d 后台运行  
# -p 指定端口映射  宿主机/容器
# -P 随机端口映射,.宿主机会随机生成一个端口

查看docker的端口转发情况

查看docker的端口转发情况

暂停正在运行的容器

docker stop 容器id  

再次运行容器

docker start 容器id  

查看容器内所有的日志

docker logs -f 容器id
# -f 实时刷新

进入一个运行中的容器

docker exec -it 容器id /bin/bash

dockerfile

镜像是容器的基础,每次执行docker run的时候都会指定镜像作为容器运行的基础。当docker hub的镜像无法满足我们的需求时,就得自定制这些镜像。镜像的定制就是定制每一层所添加的配置、文件。如果可以吧每一层修改、安装、构建、操作的命令都写入到一个脚本,用脚本来构建、定制镜像,这个脚本就是dockerfile。

Dockerfile 是一个文本文件,其内包含了一条条的指令(Instruction),每一条指令 构建一层,因此每一条指令的内容,就是描述该层应当如何构建。

dockerfile命令

FROM centos
# 指定docker镜像操作系统
LABEL version=1.0# 容器元信息,帮助信息,Metadata,类似于代码注释
RUN echo a
# RUN指令是一个完成指令,运行指定指令
WORKDIR /root
# 切换工作目录,尽量使用绝对路径,如果路径不存在会自动创建目录
ADD newfile.tar.gz /tmp/
# 把本地文件添加到镜像中的指定目录,并解压
COPY newfile.tar.gz /tmp/
# 把本地文件添加到镜像中的指定目录
ENV MYSQL_VERSION 5.6
# 类似创建变量,增加可维护性
# RUN yum install -y mysql-server=“${MYSQL_VERSION}”

自定义flask的Dockerfile示例

flask代码:

#coding:utf8
from flask import Flask
app=Flask(__name__)
@app.route('/')
def hello():
	return "hello word"
if __name__=="__main__":
	app.run(host='0.0.0.0',port=8080)

编写Dockerfile,名字是固定的

FROM python  				#指定以python为基础镜像,它提供了python3
RUN pip3 install flask  	# 在容器内安装flask  
ADD  s24flask.py   /tmp/	#添加代码到容器中 
WORKDIR /tmp/				#切换工作目录  
CMD ["python","s24flask.py"]#通过CMD指令,让容器运行命令 是 python  s24flask.py  

执行构建命令

docker build .
# 自动检测当前目录下的Dockerfile并构建成镜像

执行镜像文件,生成容器示例

docker run -d  -p 9999:8080  5e7

docker hub仓库

公有镜像发布

https://hub.docker.com/

登陆docker hub

docker login  

推送镜像到dockerhub

# 注意要保证镜像的tag是账户名,如果镜像名字不对,需要改一下tag
docker push test/centps-cmd-exec:latest

下载镜像

docker pull test/centos-entrypoint-exec

私有镜像仓库

下载registry镜像并且启动私有仓库容器

私有仓库会被创建在容器的/var/lib/registry下,因此通过-v参数将镜像文件存储到本地的/opt/data/registry下
端口映射容器中的5000端口到宿主机的5000端口

docker run -d \
    -p 5000:5000 \
    -v /opt/data/registry:/var/lib/registry \
    registry

推送镜像到私有镜像仓库

私有仓库,默认只支持http方式的推送,不支持https加密的推送,需要修改配置文件支持http形式的推送

1.修改docker的配置文件,添加如下配置

{
"insecure-registries":["ip地址:5000"]
}

2.修改docker的加载配置文件

vim  /lib/systemd/system/docker.service
[Service]
Type=notify
NotifyAccess=main
#添加如下一行配置 
EnvironmentFile=-/etc/docker/daemon.json 

3.重启docker

systemctl daemon-reload
systemctl restart docker

4.重新运行私有仓库的镜像

docker run --privileged=true -d -p 5000:5000 -v /opt/data/registry:/var/lib/registry registry
#--privileged=true  以特权运行docker仓库

5.推送镜像

需要修改镜像名称

ip地址:5000/原镜像名称

推送镜像

docker push ip地址:5000/原镜像名称

6.下载镜像

docker pull ip地址:5000/原镜像名称
发布了83 篇原创文章 · 获赞 4 · 访问量 4055

猜你喜欢

转载自blog.csdn.net/wy121221612/article/details/105012963