Docker

Study Docker

2020.3.29 – Hao

安装Docker

环境查看

# 使用uname查看系统
┌──(root Arch)-[/]
└─# uname -r
5.11.11-arch1-1

# 查看系统的版本等信息
┌──(root Arch)-[/]
└─# cat /etc/os-release 
NAME="Arch Linux"
PRETTY_NAME="Arch Linux"
ID=arch
BUILD_ID=rolling
ANSI_COLOR="38;2;23;147;209"
HOME_URL="https://www.archlinux.org/"
DOCUMENTATION_URL="https://wiki.archlinux.org/"
SUPPORT_URL="https://bbs.archlinux.org/"
BUG_REPORT_URL="https://bugs.archlinux.org/"
LOGO=archlinux

安装

在这里插入图片描述

Docker的常用命令

帮助命令

docker version		# 显示docker的版本信息
docker info			# 显示docker的系统信息,包括docker的镜像和容器的数量
docker 命令 --help   # 常用

Docker的官方文档: https://docs.docker.com/
在这里插入图片描述

镜像命令

docker images 查看所有本地的主机镜像

┌──(root Arch)-[/home/zhouhao]
└─# docker images
REPOSITORY                        TAG       IMAGE ID       CREATED         SIZE
tomcat                            latest    0ce438e89a29   2 days ago      667MB
nginx                             latest    b8cf2cbeabb9   3 days ago      133MB

# 解释
REPOSITORY 镜像的仓库源
TAG        镜像的标签
IMAGE ID   镜像的ID
CREATED    镜像的创建时间
SIZE	   镜像的大小

# 可选项
Options:
  -a, --all    #列出所有镜像 
  Show all images (default hides intermediate images)
  
  -q, --quiet  #只显示镜像ID
  Only show image IDs
  

docker search搜索镜像

┌──(root Arch)-[/home/zhouhao]
└─ # docker search mysql
NAME                              DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
mysql                             MySQL is a widely used, open-source relation…   10676     [OK]       
mariadb                           MariaDB Server is a high performing open sou…   4010      [OK]       
# 可选项, 通过搜索来过滤
--filter=STARS=3000 # 搜索出STARS大于3000的镜像

docker pull 下载镜像

# 下载镜像 docker pull 镜像名:tag  (tag为版本号)
# 不指定版本号默认是下载最新版本的镜像
┌──(root Arch)-[/home/zhouhao]
└─# docker pull centos                                                           
Using default tag: latest # 如果不写tag 默认是lastest
latest: Pulling from library/centos
7a0437f04f83: Pull complete  # 分层下载
Digest: sha256:5528e8b1b1719d34604c87e11dcd1c0a20bedf  # 签名
Status: Downloaded newer image for centos:latest
docker.io/library/centos:latest # 真实地址

docker pull centos  # 等价于 docker pull docker.io/library/centos:latest

# 指定版本下载

容器命令

docker start 容器ID #启动容器
docker attach 容器id #进入容器
删除全部容器: docker rm $(docker ps -aq)
docker image rm -f 镜像ID # 删除对应ID的镜像
需要注意删除镜像和容器的命令不一样。
# docker rmi ID  ,其中 容器(rm)  和 镜像(rmi)

其他重要命令

1. 容器保存为镜像
  • 我们可以通过以下命令将容器保存为镜像
docker commit ubuntu pwn
# ubuntu是容器名称
# pwn是新的镜像名称
2. 镜像的导出导入

有时我们需要将一台电脑上的镜像复制到另一台电脑上使用,除了可以借助仓库外,还可以直接将镜像保存成一个文件,再拷贝到另一台电脑上导入使用。

  1. 使用export 和 import命令

    # 导出镜像
    # 使用docker export 命令根据容器 ID 将镜像导出成一个文件。
    
    docker export f299f501774c > pwn.tar
    
    # 导入镜像
    # 使用 docker import 命令则可将这个镜像文件导入进来。
    docker import  pwn < pwn.tar
    

# 保存镜像
# 下面使用 docker save 命令根据 ID 将镜像保存成一个文件。
docker save 0fdf2b4c26d3 > pwn.tar

(2)我们还可以同时将多个 image 打包成一个文件,比如下面将镜像库中的 tomcat 和 centos 打包:
docker save -o images.tar tomcat:9.6 centos:3.4

# 载入镜像
使用 docker load 命令则可将这个镜像文件载入进来。

docker load <  .tar

# 两种方案的差别
特别注意:两种方法不可混用。
如果使用 import 导入 save 产生的文件,虽然导入不提示错误,但是启动容器时会提示失败,会出现类似"docker: Error response from daemon: Container command not found or does not exist"的错误。

# 1,文件大小不同
export 导出的镜像文件体积小于 save 保存的镜像

# 2,是否可以对镜像重命名
docker import 可以为镜像指定新名称
docker load 不能对载入的镜像重命名

# 3,是否可以同时将多个镜像打包到一个文件中
docker export 不支持
docker save 支持

# 4,是否包含镜像历史
export 导出(import 导入)是根据容器拿到的镜像,再导入时会丢失镜像所有的历史记录和元数据信息(即仅保存容器当时的快照状态),所以无法进行回滚操作。
而 save 保存(load 加载)的镜像,没有丢失镜像的历史,可以回滚到之前的层(layer)。

# 5,应用场景不同
docker export 的应用场景:主要用来制作基础镜像,比如我们从一个 ubuntu 镜像启动一个容器,然后安装一些软件和进行一些设置后,使用 docker export 保存为一个基础镜像。然后,把这个镜像分发给其他人使用,比如作为基础的开发环境。
docker save 的应用场景:如果我们的应用是使用 docker-compose.yml 编排的多个镜像组合,但我们要部署的客户服务器并不能连外网。这时就可以使用 docker save 将用到的镜像打个包,然后拷贝到客户服务器上使用 docker load 载入。

容器数据卷

什么是数据卷

如果数据都在容器中,那我们把容器删除,数据就会丢失 需求:数据可以持久化

比如我们有一个MySQL数据库,如果把容器删除了,相当有删库跑路!需求:MySQL数据可以存储在本地!

容器之间可以有一个数据共享的技术!Docker容器中产生的数据,同步到本地!

这就是卷技术!目录挂载,将我们容器内的目录,挂载到Linux上面!


总结一句话: 容器的持久化和同步操作!容器间也是可以数据共享的!

使用数据卷

方式一:直接使用命令挂载 -v

docker run -it -v 主机目录:容器目录

# 测试
[zhouhao@Arch] sudo docker run -it -v /home/Docker:/home ubuntu /bin/bash

# 容器启动后我们可以使用 docker inspect 容器ID -->查看信息

实战:安装MySQL

思考:MySQL数据持久化的问题


# 运行容器,需要做数据挂载
# 安装MySQL,需要配置密码,!!
# 官方测试:
docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
# 运行
-d 后台运行
-p 端口映射
-v 卷挂载
-e 环境配置 [MYSQL_ROOT_PASSWORD : 为设置MySQL的密码]
--name 容器名字
# docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123.com --name mysql_01 mysql

# 测试连接数据库
mysql -h127.0.0.1 -uroot -p123.com -P3310

具名和匿名挂载

#匿名挂载
-v 容器内路径
-P 随机指定端口映射
docker run -d -P --name nginx_01 -v /etc/nginx nginx

docker volume --help #查看关于docker卷的命令

#查看所以volume的情况
docker volume ls
local   4aa455fa5eef0bcba61b28ac8963661f88f35396a8b7ef37bbfa08abfb8a8f88
# 这种就是匿名挂载 我们发现这种挂载我们在-v后面只接了容器内路径,没有写容器外路径

# 具名挂载
┌──(root💔kali)-[~]
└─# docker run -d -P --name pwn -v work-space:/usr/local docker_pwn:18.04
06792438d549dc6145c498170987d445790f2251ff684a6d1068ab441abf0c27
┌──(root💔kali)-[~]
└─# docker volume ls
DRIVER    VOLUME NAME
local     work-space
# 通过 -v 卷名:容器路径
# docker volume ls 查看卷

┌──(root💔kali)-[~]
└─# docker volume inspect work-space 
[
    {
        "CreatedAt": "2021-05-23T00:51:13-04:00",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/work-space/_data",
        "Name": "work-space",
        "Options": null,
        "Scope": "local"
    }
]

在这里插入图片描述

拓展:

# 通过 -v 容器内路径,ro rw 来改变读写权限
ro readonly  # 只读
rw readwrite # 可读可写
# 一旦设置了容器权限,容器对我们挂载出来的内容就有限定了!
docker run -d -P --name pwn -v work-space:/usr/local:ro docker_pwn:18.04
docker run -d -P --name pwn -v work-space:/usr/local:rw docker_pwn:18.04
# ro 只要看到ro就说明这个路径只能通过宿主机来操作,容器内部是无法操作

初识Dockerfile

Docckerfile 就是用来构建 docker 镜像的构建文件 (命令脚本)

通过这个脚本可以生成镜像,镜像是一层一层的

# 创建一个dockerfile文件, 名字可以随机 建议Dockerfile
# 文件中的内容 指令(大写)  参数
FROM centos
VOLUME ["volume01","volume02"]
CMD echo "----end----"
CMD /bin/bash
# 这里的每一个命令,就是镜像的一层


在这里插入图片描述

数据卷容器

在这里插入图片描述

快捷键 Ctrl+P+Q --> 不关闭地退出当前容器

# 启动三个容器 (使用刚刚用Dockerfile生成的镜像)
# 启动第一个容器
docker run -it --name docker01 zhouhao/centos:1.0

在这里插入图片描述

# 启动第二个容器
docker run -it --name docker02 --volumes-from docker01 zhouhao/centos:1.0
    1. 容器保存为镜像

我们可以通过以下命令将容器保存为镜像

docker commit pinyougou_nginx mynginx

    1

    pinyougou_nginx是容器名称
    mynginx是新的镜像名称

Dockerfile

Dockerfile介绍

Dockerfile 用来构建docker镜像的文件! --> 命令参数脚本

构建步骤:

  1. 编写一个dockerfile文件
  2. dockerbuild 构建成为一个镜像
  3. docker run 运行镜像
  4. docker push 发布 (DockerHub , 阿里云镜像仓库)

官方的做法:

在这里插入图片描述

很多官方镜像都是基础包,好多功能和命令都没有.所以我们可以使用 DockerFile 来自己搭建自己的镜像

Dockerfile的搭建过程

基础知识:

  1. 每个保留关键字(指令)都必须是大写字母
  2. 执行从上到下执行
  3. # 号表示注释
  4. 每一个指令都会创建提交一个新的镜像层,并提交.
    在这里插入图片描述

DockerFile是面向开发的,我们以后要发布项目,做镜像都需要编写dockerfile文件,这个文件十分简单!
Docker 镜像逐渐成为企业交付的标准,必须要掌握!


步骤:开发,部署,运维…缺一不可

  1. DockerFile:构建文件,定义了一切的步骤,源代码

  2. DockerImage:通过DockerFile 构建生成的镜像,最终发布和运行的产品,原来是jar war

  3. Docker容器:容器就是镜像运行起来提供服务的.

Dockerfile的指令

FROM          # 基础镜像,一切从这里开始构建
MAINTAINER    # 镜像是谁写的,姓名+邮箱
RUN           # 镜像构建的时候需要运行的命令
ADD           # 步骤:tomcat镜像,这个tomcat压缩包!添加内容
WORKDIR       # 镜像的工作目录
VOLUME        # 挂载目录
EXPOSE        # 保留端口配置
CMD           # 指定这个容器启动的时候要运行的命令 ,只有最后一个会生效,可被替代
ENTRYPOINT    # 指定这个容器启动的时候要运行的命令,可以追加命令
ONBUILD       # 当构建一个被继承 DockerFile 这个时候就会运行 ONBUILD 的指令,出发指令。
COPY          # 类似ADD,将我们的文件拷贝到镜像中。但是COPY不会自动解压
ENV           # 构建的时候设置环境变量

实战测试


Docker Hub 中 99%镜像都是从这个基础镜像过来的 FROM scratch

在这里插入图片描述

创建一个自己的 Centos

# 1. 编写Dockerfile的文件
FROM centos
MAINTAINER zhouhao<zhouhaobusy@163.com>

ENV MYPATH /usr/local
WORKDIR $MYPATH
RUN yum -y install vim
RUN yum -y install net-tools

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

# 2. 通过这个文件构建镜像
docker build -f dockerfile的路径 -t 镜像名:[tag]

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值