docker安装、使用、dockerfile介绍

在不经意之间,了解到了docker,了解了之后,发现世界变化真快,还在我们熟悉的自己敲命令安装linux环境的时候,别人已经设计出了一种可以不依赖具体环境的容器,科技的世界变化的挺快的,现在我们来拥抱一下科技吧。

1、docker安装

老规矩,要使用docker必须安装docker,不过我这里不打算细讲了,因为之前讲了很多安装了,这里推荐一个网站,docker官网有详细介绍安装的,只要按照步骤安装即可。centos下安装docker

1.1 介绍

打开这个网站,我们可以看到,官方介绍有3种方法安装:
在这里插入图片描述

1.2 安装

我用之前用的是第一种方法,通过仓库安装:
下面这些命令是设置仓库的,就按照输入即可
在这里插入图片描述

现在就到真正的安装docker镜像了,输入这个命令即可:
在这里插入图片描述

1.3 测试

官方也推荐了测试的方法,安装完成之后,就可以测试一下安装是否成功。
在这里插入图片描述

2、docker初探

2.1 docker命令

docker的核心就是镜像,我们会使用docker做成不同的镜像,然后上传到docker的服务器上,需要使用的时候就直接拉取镜像即可。docker镜像

我们先来查看本地的docker镜像,hello-world是我刚刚运行的,所以会加载到本地缓存,可以删除掉。
在这里插入图片描述

拉取镜像:
我这里拉取的是centos7的镜像:
在这里插入图片描述
我们可以通过docker images来查看本地的镜像:
在这里插入图片描述
这里可以看到我们本地有两个镜像,其中就是我们刚刚拉下来的centos镜像。

运行容器:
在这里插入图片描述
如果运行docker的时候,本地没有这个镜像,docker会尝试去仓库中拉取镜像,就像我们运行的第一个镜像的时候,就是从仓库中拉取了hello-world的镜像,centos也是,但是我们拉取的centos不是一个真正的系统,而是一个基本的文件系统,内核是跟我们虚拟机共用的。

run是启动镜像的命令,镜像运行之后就变成容器
-d 命令是后台执行,然后可以使用attach命令进入后台运行的容器
如果是退出了容器,也是需要run再次运行

退出容器:
在这里插入图片描述

查看docker正在运行的容器:
在这里插入图片描述
目前我没有运行容器,所以是空的

查看运行的所有容器:
在这里插入图片描述
这个表示着docker运行过的所有的镜像

启动已经停止运行的容器:
在这里插入图片描述
运行的的是uid。
start是运行已经停止的容器,跟上面的run不一样
start只能运行已经停止的容器,不包括退出的容器

停止容器的命令:
在这里插入图片描述

重启容器:
加粗样式

进入容器:
在这里插入图片描述
这个命令进入容器,是同步的,也就是我这边操作,另一边也同步看到,不是很常用。这个命令好像是需要用CTRL+P+Q退出的情况下,才能进

容器不退出,返回宿主机:
有快捷键 CTRL+P+Q

exec命令,进入容器:

docker exec -it 8ff9032399b6 /bin/bash

这个命令进入容器比较常用,相当于创建了一个/bin/bash交互界面,不像之前的attach一样,是同步的,这个对个线程

删除容器:
在这里插入图片描述
删除容器简单粗暴。删除镜像是docker rmi i代表的是image

导出镜像

docker export df9c17f558df > ubuntu.tar

如果需要把本地的容器导出,可以使用docker export命令,只要是方便近距离的传输。

导入镜像

cat ubuntu.tar | docker import - ubuntu:v1

竟然有导出,就有导入,如果同事导出了镜像给我,我就需要导入镜像。

3、制作docker镜像

3.1 dockerfile构建镜像

构建一个新的镜像有两种方法,

  • 第一种是通过docker commit直接上传镜像,在《我的第一本docker书》中有描述,简单的说就是手动执行命令,拉取各个软件,等等,等到准备好了之后,进行一次docker commit,这个就有点像我们在VMware中进行备份一样,我们打开虚拟机,然后预装各个软件,等软件装好了之后,就打包一份备份镜像,等以后需要使用的时候,再次打开。

  • 第二种使用dockerfile来构建,就是等下要讲的,这种方式比较智能,也比较通用,可以随时编译,然后再上传到hub.docker中,第一种就相当于手动输入命令。

先来看一个完整的dockerfile,准备先构建,然后再讲解每一个步骤:

# This is dockerfile for nginx

# base image
FROM centos:7

# author
MAINTAINER chenguanren 1033177205@qq.com

COPY CentOS-Base.repo.backup /etc/yum.repos.d/CentOS-Base.repo.backup

ADD nginx-1.13.7.tar.gz /usr/local/src/
ADD pcre-8.41.tar.gz /usr/local/src/
ADD zlib-1.2.11.tar.gz /usr/local/src/
ADD openssl-1.1.0g.tar.gz /usr/local/src/

RUN yum makecache && yum update -y
RUN yum install make automake gcc gcc-c++ kernel-devel -y

WORKDIR /usr/local/src/nginx-1.13.7

RUN ./configure --prefix=/usr/local/nginx --with-http_realip_module --with-http_addition_module --with-http_gzip_static_module --with-http_secure_link_module --with-http_stub_status_module --with-stream --with-pcre=/usr/local/src/pcre-8.41 --with-zlib=/usr/local/src/zlib-1.2.11 --with-openssl=/usr/local/src/openssl-1.1.0g && make && make install

RUN echo "daemon off;" >> /usr/local/nginx/conf/nginx.conf

EXPOSE 80


CMD ["/usr/local/nginx/sbin/nginx", "-c", "/usr/local/nginx/conf/nginx.conf"]

构建:

docker build -t="ren/nginx:v2" .

-t是指定这个镜像的名字,构建的时候,尽量带上标签,说明我们构建的镜像是哪一个版本的,:后面的就是标签,最后还有一个点,是指定docker构建的时候,是当前目录。

Sending build context to Docker daemon   9.08MB
Step 1/14 : FROM centos:7
 ---> 5e35e350aded
Step 2/14 : MAINTAINER chenguanren 1033177205@qq.com
 ---> Using cache
 ---> 839a5d1337fa
Step 3/14 : COPY CentOS-Base.repo.backup /etc/yum.repos.d/CentOS-Base.repo.backup
 ---> Using cache
 ---> d45b5c517adc
Step 4/14 : ADD nginx-1.13.7.tar.gz /usr/local/src/
 ---> Using cache
 ---> 9226240a4344
Step 5/14 : ADD pcre-8.41.tar.gz /usr/local/src/
 ---> Using cache
 ---> b68559cd6e62
Step 6/14 : ADD zlib-1.2.11.tar.gz /usr/local/src/
 ---> Using cache
 ---> 721c96377aed
Step 7/14 : ADD openssl-1.1.0g.tar.gz /usr/local/src/
 ---> Using cache
 ---> e4bf83b558fe
Step 8/14 : RUN yum makecache && yum update -y
 ---> Using cache
 ---> 08171fbbb680
Step 9/14 : RUN yum install make automake gcc gcc-c++ kernel-devel -y
 ---> Using cache
 ---> 249750da2f44
Step 10/14 : WORKDIR /usr/local/src/nginx-1.13.7
 ---> Using cache
 ---> 1c4fe14e5884
Step 11/14 : RUN ./configure --prefix=/usr/local/nginx --with-http_realip_module --with-http_addition_module --with-http_gzip_static_module --with-http_secure_link_module --with-http_stub_status_module --with-stream --with-pcre=/usr/local/src/pcre-8.41 --with-zlib=/usr/local/src/zlib-1.2.11 --with-openssl=/usr/local/src/openssl-1.1.0g && make && make install
 ---> Using cache
 ---> ee040251ea74
Step 12/14 : RUN echo "daemon off;" >> /usr/local/nginx/conf/nginx.conf
 ---> Using cache
 ---> 799b63ae3e48
Step 13/14 : EXPOSE 80
 ---> Using cache
 ---> 72ed6216eb39
Step 14/14 : CMD ["/usr/local/nginx/sbin/nginx", "-c", "/usr/local/nginx/conf/nginx.conf"]
 ---> Using cache
 ---> 5a0cb35fb050
Successfully built 5a0cb35fb050
Successfully tagged ren/nginx:v2

看着输出的信息,就可以看到docker是一步一步按照我们写的dockerfile来构建的,直到构建完成之后,会生成一个新镜像ID。

构建完成之后,可以通过docker images查看镜像:
在这里插入图片描述

运行新镜像:

docker run --name nginx-test -p 8080:80 -d ren/nginx:v2

使用这个命令就可以运行我刚刚编译好的镜像,-d是后台运行,比较符合nginx作为后台程序运行。–name是指定运行程序的名字。

3.2 dockerfile指令

上面写过dockerfile也编译过,但是没有详细讲过,现在可以单独讲解一下各个命令:

3.2.1 CMD

cmd命令是docker启动启动的时候运行的命令,这跟我们使用run的时候,带的命令参数一样

docker run -it -d 1033177205/nginx:v1 /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf

我这里启动nginx的时候,会去执行我后面带的参数,/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf,也就是会启动这个nginx的程序,这种传参跟我们在dockerfile写的、
CMD ["/usr/local/nginx/sbin/nginx", “-c”, “/usr/local/nginx/conf/nginx.conf”]这个是同一个意思,也就是如果不带参数,会默认执行这个CMD命令, 但是如果带了参数,就是把CMD中的参数覆盖掉,这个需要执行,可以试试传参/bin/bash就可以知道,这时候就不会启动nginx了

dockerfile默认只支持一个CMD的,如果写了多个CMD.,只会执行最后一个CMD

3.2.2 ENTRYPOINT

ENTRYPOINT这个倒是有点像内置命令,我们修改一个dockerfile

ENTRYPOINT ["/usr/local/nginx/sbin/nginx"]

然后重新构建,运行的时候,我们输入如下命令:

docker run -it -d 1033177205/nginx:v1 -c /usr/local/nginx/conf/nginx.conf

docker会把后面的参数传给ENTRYPOINT ,也就是在镜像中,最终运行的命令是:
/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
相等于我指定了内置命令,参数还是可以通过外部传参进来

3.2.3 WORKDIR

看着单词就是说工作目录,

WORKDIR /usr/local/src/nginx-1.13.7

RUN ./configure --prefix=/usr/local/nginx --with-http_realip_module --with-http_addition_module --with-http_gzip_static_module --with-http_secure_link_module --with-http_stub_status_module --with-stream --with-pcre=/usr/local/src/pcre-8.41 --with-zlib=/usr/local/src/zlib-1.2.11 --with-openssl=/usr/local/src/openssl-1.1.0g && make && make install

dockerfile的使用到工作目录,我们这里先指定一个工作目录,这个工作目录下,
在这里插入图片描述
就有我们用的软件,所以这时候,我们就目录就在/usr/local/src/nginx-1.13.7下,所以直接./configure执行我们需要配置的命令即可。

还有一点是我们进入容器的时候,都会默认进入这个WORKDIR路径下,可以通过命令切换工作路径,-w 路径,就可以切换了。

3.2.4 ENV

ENV指令是用来在镜像构建过程中设置环境变量,这个环境变量也会在构建后的容器中生效,像是系统的一个环境变量的感觉。

ENV TARGET_DIR /opt/app
WORKDIR $TARGET_DIR 

可以在运行的时候通过-e 来传递环境变量的值。

3.2.5 USER

USER指令用来指定该镜像会以什么的用户去运行,可以通过-u覆盖掉这个参数。

3.2.6 VOLUME

VOLUME指令用来向基于镜像创建的容器添加卷,我们知道镜像是不可以修改的,除非你定时commit这个镜像,但是感觉这种做法不太好,如果是数据库的数据,把他上传到镜像中,总感觉怪怪的,所以需要一个外部的挂载点,把这部分的数据挂载出去,然后镜像还是当初的一个镜像,没有任何有关的数据。目前还用到,等用到的时候,具体实操一波。

3.2.7 ADD

这个命令用的最多,就是把构建环境下的文件或目录复制到镜像中,上面的dockerfile就有使用。

docker是根据目的地址参数的末尾字符来判断源文件是目录还是文件,如果地址是/结尾,就认定是一个源文件是一个目录,否则认为是文件

如果是压缩文件的话,docker会自动解压到当前文件夹,看我们做的镜像就知道了

3.2.8 COPY

COPY和ADD比较类似,不同的是,COPY就不会去做提取和解压的动作。

3.2.9 ONBUILD

不是很懂,用到再说

3.3 把镜像推到docker hub上

把镜像推到docker hub上有点坑,需要先登录:
登录命令:

docker login

填好账号密码。然后我们之前做的镜像是需要符合一定要求的:
给自己镜像命名的时候格式应该是: docker注册用户名/镜像名,比如我的docker用户名为 1033177205,那么我的镜像tag就为 1033177205/nginx,不然是push不上去的

推上去的命令:

docker push 1033177205/nginx:v1

可以直接查看hub.docker网站,就可以看到推上去的镜像
在这里插入图片描述

从hub上拉取镜像:

docker pull 1033177205/nginx:v1

我这里是看了《我的第一本docker书》总结的,需要看详细的,可以去看一下这本书,总结的意思就是只是单纯的看书,接收知识的比例不超过10%,所以需要做做笔记,把书里的知识转化成自己的知识。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值