Docker:入门和使用和制作镜像(Dockerfile)

摘要:Docker

认识Docker

(1)虚拟化技术

虚拟化技术是一种将服务器硬件资源进行共享的手段,随着计算机各种硬件资源如磁盘,内存,CPU,网卡速率等长足发展,某台计算机的计算资源可能得不到充分的利用造成浪费,虚拟化技术就是将这些资源当作资源池进行重新分配提供给其他虚拟计算机
传统的虚拟化技术会虚拟出一套完整的硬件基础设施,包括CPU,内存,显卡,磁盘等,所有虚拟机是互相隔离的,如同多台物理机一样

(2)容器技术

容器技术属于虚拟化的方式之一,他是一种轻量级的虚拟化方案,可以让用户在一个资源隔离的进程中允许程序。
容器和虚拟机都是虚拟化技术,两者都能提供应用封装和资源隔离,主要区别如下

虚拟机 容器
隔离方式 进程级别隔离,轻度隔离 操作系统级别隔离,完全隔离
空间占用 GB MB
启动速度 分钟
迁移速度 困难 容易

docker是一种容器技术


镜像和容器

  • 镜像是类class,容器是实例化的类,镜像是文件,容器是进程
  • 先有镜像后有容器,一个镜像可以启动多个容器
  • 一旦容器从镜像被启动,二者编程互相依赖的关系,在镜像上启动的容器没有停止之前,镜像无法被删除
  • 镜像采用分层结构,最底层是base层操作系统层,层层叠加形成完成的镜像,目的是实现层和资源共享

镜像搜索

Docker镜像存储在镜像仓库服务中,默认使用Docker Hub,Docker Hub分为官方仓库和非官方仓库,官方仓库会经过Docker公司的审核并且及时更新,安全质量高,非官方的仓库来自于江湖侠客,其中也不乏优秀的镜像,使用docker search来搜索镜像

root@ubuntu:/var/lib/docker# docker search mysql
NAME                              DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
mysql                             MySQL is a widely used, open-source relation…   10995               [OK]                
mariadb                           MariaDB Server is a high performing open sou…   4164                [OK]                
mysql/mysql-server                Optimized MySQL Server Docker images. Create…   815                                     [OK]
centos/mysql-57-centos7           MySQL 5.7 SQL database server                   88                                      
mysql/mysql-cluster               Experimental MySQL Cluster Docker images. Cr…   86                                      
centurylink/mysql                 Image containing mysql. Optimized to be link…   59                                      [OK]
bitnami/mysql                     Bitnami MySQL Docker Image                      52                                      [OK]
databack/mysql-backup             Back up mysql databases to... anywhere!         44                                      
deitch/mysql-backup               REPLACED! Please use http://hub.docker.com/r…   41                                      [OK]
prom/mysqld-exporter                                                              39                                      [OK]
tutum/mysql                       Base docker image to run a MySQL database se…   35                                      
linuxserver/mysql                 A Mysql container, brought to you by LinuxSe…   30                                      
schickling/mysql-backup-s3        Backup MySQL to S3 (supports periodic backup…   29                                      [OK]
centos/mysql-56-centos7           MySQL 5.6 SQL database server                   20                                      
circleci/mysql                    MySQL is a widely used, open-source relation…   20                                      
mysql/mysql-router                MySQL Router provides transparent routing be…   19                                      
arey/mysql-client                 Run a MySQL client from a docker container      17                                      [OK]
fradelg/mysql-cron-backup         MySQL/MariaDB database backup using cron tas…   13                                      [OK]
yloeffler/mysql-backup            This image runs mysqldump to backup data usi…   7                                       [OK]
genschsa/mysql-employees          MySQL Employee Sample Database                  7                                       [OK]
openshift/mysql-55-centos7        DEPRECATED: A Centos7 based MySQL v5.5 image…   6                                       
devilbox/mysql                    Retagged MySQL, MariaDB and PerconaDB offici…   3                                       
ansibleplaybookbundle/mysql-apb   An APB which deploys RHSCL MySQL                2                                       [OK]
widdpim/mysql-client              Dockerized MySQL Client (5.7) including Curl…   1                                       [OK]
jelastic/mysql                    An image of the MySQL database server mainta…   1                                       

对以上命令和返回结果做几点说明

  • search:会对Docker仓库服务进行检索,检索其中NAMEDESCRIPTION相关含有mysql内容的镜像
  • NAME:仓库名称,如果是官方仓库就直接是仓库名称,如果是非官方仓库,仓库名称带有/,代表机构名或者组织机构名/仓库名
  • DESCRIPTION:镜像描述
  • STARS:用户喜欢程度
  • OFFICIAL:是否是官方仓库,OK的话就是官方仓库,和NAME中是否带有/是一致的
  • AUTOMATED:Dockerfile是否是公开的可供自由查看

docker默认输出25行,使用--limit参数可以指定输出的行数,可以给search命令增加过滤条件,使用--filter获得官方仓库

root@ubuntu:/var/lib/docker# docker search mysql --filter "is-official=true"
NAME                DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
mysql               MySQL is a widely used, open-source relation…   10995               [OK]                
mariadb             MariaDB Server is a high performing open sou…   4164                [OK]                
phpmyadmin          phpMyAdmin - A web interface for MySQL and M…   240                 [OK]  

镜像下载、查看、删除

从Docker镜像仓库服务中拉取镜像使用命令docker pull,指定仓库名称标签即可找到指定的镜像,命令格式是

docker image pull :

如果不指定tag,默认拉取latest标签的镜像,如果要拉取指定tag版本的镜像,需要登录docker hub进行查找
https://hub.docker.com,比如查看docker上支持的MySQL版本,有8.0.25,8.0等

  • 非官方的镜像镜像仓库需要指定机构组织名/仓库名,比如tiangolo/uvicorn-gunicorn-fastapi

以mysql为例,分别指定tag镜像标签和不指定,使用docker images查看本地仓库存储的镜像

root@ubuntu:/var/lib/docker# docker pull mysql
root@ubuntu:/var/lib/docker# docker pull mysql:5.7
root@ubuntu:/var/lib/docker# docker images
REPOSITORY                          TAG                 IMAGE ID            CREATED             SIZE
mysql                               5.7                 2c9028880e58        4 weeks ago         447MB
mysql                               latest              c0cdc95609f1        4 weeks ago         556MB

删除镜像使用docker rmi,指定镜像名称或者镜像ID,当存在此镜像启动的容器正在运行或者此镜像是其他镜像所依赖的镜像时,不能直接删除

root@ubuntu:/var/lib/docker# docker rmi 2c9028880e58
Untagged: mysql:5.7
Untagged: mysql@sha256:a682e3c78fc5bd941e9db080b4796c75f69a28a8cad65677c23f7a9f18ba21fa
Deleted: sha256:2c9028880e5814e8923c278d7e2059f9066d56608a21cd3f83a01e3337bacd68
Deleted: sha256:c49c5c776f1bc87cdfff451ef39ce16a1ef45829e10203f4d9a153a6889ec15e
Deleted: sha256:8345316eca77700e62470611446529113579712a787d356e5c8656a41c244aee
Deleted: sha256:8ae51b87111404bd3e3bde4115ea2fe3fd2bb2cf67158460423c361a24df156b
Deleted: sha256:9d5afda6f6dcf8dd59aef5c02099f1d3b3b0c9ae4f2bb7a61627613e8cdfe562

镜像命令整理

  • docker search:去镜像仓库服务搜索镜像
  • docker images:显示本地仓库已有的镜像
  • docker pull:从镜像仓库服务拉取镜像到本地仓库
  • docker rmi:从本地镜像服务删除镜像

Dockerfile基础

Dockerfile是一个Docker镜像的描述文件,包含了若干个命令行,支持以#进行注释,它的结构分为基础镜像层维护者操作指令容器启动后指令,以一个简单的Dockerfile为例

# 基础镜像
FROM python:3.7
# 维护者
MAINTAINER gp
# 指定环境变量
ENV PIPURL "https://pypi.tuna.tsinghua.edu.cn/simple"
# 操作命令
ADD ./requirements.txt /home/
WORKDIR /home
RUN pip install --no-cache-dir -i ${PIPURL} --default-timeout=1000 -r requirements.txt
# 容器启动后指令
CMD gunicorn -c gun.conf.py manage:app

下面对Dockerfile的常用关键字进行总结:

  • FROM:础镜像,当前新镜像是基于哪个镜像的
  • MAINTAINER:镜像维护者的姓名和邮箱地址
  • RUN:容器构建时需要运行的命令,可以执行多个命令,多个命令用&&隔开
  • EXPOSE:当前容器对外暴露的端口号,实际没什么用
  • WORKDIR:指定在容器创建后,终端默认登录进来工作目录,一个落脚点,可以多次指定,相当于cd命令
  • ENV:用来在构建镜像过程中设置环境变量,在下文中使用${profile}调用
  • ADD:将宿主机目录下的文件拷贝到镜像里面,宿主机路径->镜像路径,在构建镜像的过程中完成的,ADD指令还支持通过URL从远程服务器读取资源并复制到镜像中
  • COPY:将宿主机目录下的文件拷贝到镜像里面,宿主机路径->镜像路径,它只是拷贝,不会自动处理URL和解压tar压缩包,在构建镜像的过程中完成的,满足同等功能的情况下,推荐使用COPY指令
  • CMD:指定一个容器启动时要运行的命令。dockerfile中可以有多个CMD指令,但只有最后一个生效,是容器启动后的命令,如果docker run指定了运行命令会被覆盖,支持Shell和exec模式
  • ENTRYPOINT:指定一个容器启动时要运行的命令,容器启动后的命令,如果docker run指定了运行命令不会被覆盖,支持Shell和exec模式

其中CMD和ENTRYPOINT支持shell和exec模式,在Dockerfile中可以做如下改写

CMD ["gunicorn", "-c", "gun.conf.py", "manage:app"]

RUN中多个命令用&&隔开,可以在Dockerfile中做如下改写

RUN pip install flask==1.1.1 \
    && pip install Flask-SQLAlchemy==2.4.4 \
    && pip install gevent==20.9.0 \
    && pip install gunicorn==20.0.4 \
    && pip install numpy==1.19.5 \
    && pip install pymysql==1.0.0 \
    && pip install SQLAlchemy==1.3.13 \
    && pip install python-dotenv==0.15.0 \
    && pip install Flask-Caching==1.9.0

使用Dockerfile构建镜像

使用Dockerfile构建镜像使用docker build命令,启动如下

root@ubuntu:~/myproject/pira_score_web_application# docker build -t gp/pira_score:v1 .

docker build中最后的.代表当前目录,通常把Dockerfile放在执行docker build的当前目录下,其他主要参数如下

  • -t:--tag, -t: 镜像的名字及标签,本例中设置了gp/pira_score名称和v1标签
  • -f:指定要使用的Dockerfile路径

构建完成后查看docker本地镜像仓库

root@ubuntu:~/myproject/pira_score_web_application# docker images
REPOSITORY                          TAG                 IMAGE ID            CREATED             SIZE
gp/pira_score                       v1                  d3f18f8689fb        14 minutes ago      976MB

镜像的导入导出

镜像的导出使用docker save命令,例如

root@ubuntu:~# docker save echo_test:v1 > echo_test_v1.tar

注意save指定的镜像指定为镜像名+标签,否则load导入时镜像名为,下一步在当下目录下生成镜像tar文件,scp到另一台机器上的docker服务上再load进去则会自动导入一个名称和标签一样的镜像

root@ubuntu:~# scp echo_test_v1.tar root@cloudera01:/home/gp
[root@cloudera01]# docker load < echo_test_v1.tar 
Loaded image: echo_test:v1

你可能感兴趣的:(Docker:入门和使用和制作镜像(Dockerfile))