0%

开发工具|学点docker

git

Docker概述

Docker应用

  • 部署环境复杂,非常费时费力
  • 环境不能跨平台
  • docker可以把环境打包成镜像,直接运行即可
  • docker通过隔离机制,可以将服务器利用到极致

Docker的功能

  • 虚拟机技术

  • 容器化技术

  • DevOps(开发 + 运维)

  • 应用更加快速的交付和部署

  • 更便捷的升级和扩缩容

  • 更加简单的系统运维

  • 更加高效的计算资源利用

Docker安装

1.Docker基本组成

  • 仓库:仓库就是存放镜像的地方

  • 镜像:docker镜像就像一个模板,通过镜像可以创建多个容器

  • 容器:容器可以独立运行一个或者多组应用(启动,停止,删除)

2.run工作流程

在这里插入图片描述

3.Docker工作原理

Docker 工作原理

4.Docker与VM的区别

containers-vs-virtual-machines.jpg

  • Docker的抽象层比虚拟机少
  • docker利用的是宿主机的内核,vm需要的是Guest OS(vm每次都要加载操作系统的内核)

Docker命令

img

1.帮助命令

1
2
3
docker version
docker info
docker --help

2.镜像命令

(1)docker images查看本地主机上的镜像

1
2
$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED SIZE

解析:

  • REPOSITORY :镜像的仓库源
  • TAG:镜像的标签
  • IMAGE ID:镜像的id
  • CREATED:镜像的创建时间
  • SIZE:镜像大小

可选项:

  • -a : 列出所有镜像
  • -q:只显示镜像id

(2)docker search 搜索镜像

1
NAME  DESCRIPTION   STARS  OFFICIAL   AUTOMATED

可选项,可以过滤搜索结果:

–filter=STARS=3000 :搜索stars大于3000的镜像

(3)docker pull 拉取镜像:tag ,默认拉取最新版

(4)docker rmi 删除镜像名称/id

1
2
3
4
5
# 删除mysql镜像
docker rmi -f mysql:5.7

# 递归删除所有镜像
docker -f $(docker images -aq)

3.容器命令

有了镜像我们才能创建容器

(1)新建镜像并启动:dokcer run [可选参数] image

容器内相当于一个新的虚拟环境

1
docker run -it centos /bin/bash

相关参数:

  • –name = “Name” :容器名字,用于区分容器
  • -d :后台方式运行
  • -it : 使用交互方式运行,可进入容器查看内容(开启容器终端)
  • -p:指定容器端口

(2)查看容器:docker ps

1
docker ps  	  #查看运行中的容器

相关参数:

  • -a :查看所有容器(包括已终止的容器)
  • -n = ? :显示最近创建的容器
  • -q : 只显示容器的编号

(3)退出容器

1
2
exit # 容器停止并退出
ctrl + P + Q # 容器不停止退出(按P,Q这个设计多少有点反人类)

(4)删除容器

1
2
docker rm 容器id	# 删除指定的容器(不能删除运行中的容器,加-f强制删除)
docker rm -f $(docker ps -aq) # 删除所有容器

(5)启动和停止容器的操作

1
2
3
4
docker start 容器id # 启动容器
docker restart 容器id # 重启容器
docker stop 容器id # 停止当前正在运行的容器
docker kill 容器id # 强制停止当前容器

4.操作命令

(1)后台启动命令

docker容器使用后台运行时(docker run -d centos),必须要有一个前台进程,如果docker发现自己没有应用了,就会自动停止

(2)查看日志命令

查看容器运行的日志

1
docker logs -f -t --tail 容器

(3)查看容器进程信息

1
docker top 容器id

(4)查看镜像元数据

1
docker inspect 容器id

(5)进入当前正在运行的容器

1
2
3
4
5
6
7
# 我们通常容器都是使用后台方式运行的,需要进入容器,修改一些配置

# 命令1:进入容器后开启一个新的终端(相当于开启了另一个进程)
docker exec -it 容器id bashShell

# 命令2:进入容器正在执行的终端中,不会启动新的进程
docker attach 容器id

(6)从容器中拷贝文件到主机上

1
docker cp 2e18c3e0375a:/home/test.py /home/autovy/桌面

拷贝是一个手动过程,从封闭的容器中拿到需要留存的数据,而使用数据卷

则可以实现自动同步

Docker镜像

推荐文章:docker镜像讲解

1.Portainer可视化工具

2.镜像简介

  • 镜像就是一种轻量级,可执行的独立软件包,用来打包软件运行环境和基于环境开会的软件(包括代码,运行时,库,环境变量,配置文件)
  • 镜像来源:
    • 从远程仓库下载
    • 自己制作的镜像DockerFile

3.镜像加载原理

(1)联合文件系统(UnionFS)

镜像和容器不同,容器是彼此独立的,而容器是分层叠加的,可以共享相同的底层文件和目录

img

(2)镜像加载原理

共享底层资源

docker文件系统分层存储原理

4.分层理解

基于Ubuntu Linux 16.04创建一个新的镜像,这就是新镜像的第一层;如果在该镜像中添加Python包,就会在基础镜像层之上创建第二个镜像层;如果继续添加一个安全补丁,就会创建第三个镜像层。该镜像当前已经包含3个镜像层

基于Ubuntu Linux 16.04创建镜像

docker镜像默认只读,当容器启动时,一个新的可写层被加载到镜像顶部

这一层即为容器层,容器之下称为镜像层

5.commit镜像

提交一个新的镜像

1
2
3
4
docker commit 提交容器成为一个新的副本

# 命令和git原理相似
docker commit -m="提交的描述信息" -a="作者" 容器id 目标镜像名:[TAG]

容器数据卷

1.数据卷原理

容器之间有一个数据共享技术,Docker容器中产生的数据,同步到本地(从而实现数据可持久化,数据同步操作,数据存储在本地不会随着容器删除而丢失)

其本质是将容器内的目录挂载到主机上

数据卷容器实践_heima201907的博客-CSDN博客

2.数据卷使用

(1)使用命令挂载 -v

1
2
3
4
docker run -it -v 主机目录地址:容器目录地址

# 测试:将容器的目录挂载到主机目录
docker run -it -v /home/test:/home centos /bin/bash
  • 主机和容器没有对应目录时会自动创建目录
  • 通过docker inspect 可以查看到挂载信息
  • 挂载双方是双向同步关系,他们的文件内容无论哪一方更改,都会保持同步
  • 修改文件时,只需要在本地修改即可,不需要进入容器

(2)具名挂载和匿名挂载

除了上文中的指定路径挂载,我们也可以使用具名挂载和匿名挂载

匿名挂载:-v :容器目录地址

具名挂载:-v 卷名:容器目录地址

1
2
3
4
5
6
7
8
# 匿名挂载
docker run -d -P --name test1 -v /home/new centos

# 具名挂载
docker run -d -P --name test1 -v mycentos:/home/new centos

# 查看所有卷(可以看到存在匿名卷)
docker volume ls

所有的docker容器内的卷默认放在本地主机的/var/lib/docker/volumes下

(3)挂载权限

1
2
3
# 可以通过 -v 容器路径:ro,rw改变读写权限
ro # 只读,只能通过宿主机来操作,容器内部无法进行操作
rw # 可读可写,默认为可读可写

3.数据卷容器

Docker学习过程(5-数据卷)_gengli2017的博客-CSDN博客

容器间也可以进行挂载从而实现数据同步,多个子容器的数据可以挂载到一个父容器中,这个父容器就是数据卷容器

–volumes-from即可以让docker3挂载到docker1上

1
docker run -it --name docker3 --volumes-from docker1 5ce91af318b3 /bin/bash

容器之间的配置信息的传递,数据卷容器的生命周期一直持续到没有容器使用为止

DockerFile

参考文章:DokcerFile命令详解

1.DockerFile简介

DockerFile是构建docker镜像的构建文件,即命令脚本。通过这个脚本我们可以生成一个镜像。

在这里插入图片描述

2.DockerFile构建流程

(1)DockerFile内容示例

1
2
3
4
5
6
7
8
FROM centos

# 在构建镜像形成两个数据卷,因为没有指定的挂载卷会自动进行匿名挂载
VOLUME ["volume01","volume02"]

CMD echo "-----end------"

CMD /bin/bash

(2)通过DockerFile文件构建镜像

1
docker build -f dockerfile -t test/centos .

build命令, -f 打开dockerfile文件的路径,-t test/centos命名容器,.即为生成路径

(3)用自己的镜像创建容器

1
docker run -it 5ce91af318b3 /bin/bash

(4)docker push 发布镜像(开源进行)

3.DockerFile指令详解

img

(图中最后一项应为CMD指令此处更正)

补充项:

  • CMD:指定这个容器启动时要运行的命令,只有最后一个会生效,可被替代

  • ENTRYPOINT:指定这个容器启动时要运行的命令,可以追加命令

  • COPY:类似于ADD,将我们文件拷贝到镜像中

  • ENV:构建的时候设置环境变量

4.创建自己的DockerFile

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
FROM centos
MAINTAINER Autovy<autovys@gmail.com>

# 设置工作目录为/usr/local
ENV MYPATH /usr/local
WORKDIR $MYPATH

# 安装相关依赖
RUN yum -y install vim
RUN yum -y install net-tools

# 开放端口80
EXPOSE 80

CMD echo $MYPATH
CMD echo "-----end------"
CMD /bin/bash

通过docker history mycentos:0.1 命令可以查看构建镜像的过程

��过程