Docker介绍、常用命令与操作
学习前言
工作了一段时间,感觉Docker真的是一个很方便的工具,无论复现代码还是部署服务器,不用特别担心环境的错误。
为什么要学习Docker
从这么长时间使用Docker的情况来看,我认为学习Docker的主要原因便是它的方便。生产过程中有各种环境,如果每到一个服务器都进行环境的部署的话,不仅调试麻烦,实际上线的时候也会因为各种环境问题导致服务崩溃。
当前市面上复刻环境的方法一般有两种:
1、虚拟机技术,可以在操作系统中模拟硬件设备 ,然后运行另一个操作系统,比如在 Windows 系统里面运行Linux系统,这样就可以运行任意的Linux应用。因此,我们保留了某个环境的镜像,就可以复刻环境了;
2、容器技术,与虚拟机通过操作系统实现隔离不同 ,容器技术只隔离应用程序的运行时环境 ,但容器之间可以共享同一个操作系统。因此,假设我们都在Linux环境上,使用容器技术,无需模拟硬件设备,直接就使用另一个Linux环境的镜像即可;
相比于虚拟机技术,容器技术无需模拟硬件设备,底层操作系统是共享的,因此容器技术更加轻量级。
Docker基于容器技术,只需保留镜像,就可以在另外一个Linux操作系统中运行。
而Docker的使用方式也很简单,一般在Linux环境下使用,拉取一个镜像,然后运行起来即可,而后的操作就和在正常的系统中操作一样。
Docker里的必要基础概念
Docker里的必要基础概念是镜像和容器:
镜像(Image):利用Docker将运行的程序及其依赖库、函数库、配置等文件打包在一起 ,简单理解就是打包后的程序环境 ,开箱即用。称为镜像。
容器(Container):镜像运行后形成的进程就是容器 ,一个系统可以运行多个容器,Docker会给容器进程做隔离,不同进程之间不可见。
常用命令与操作
1、基础操作
a、查看docker相关信息
查看docker版本信息。
sh
docker version
显示docker系统的信息
sh
docker info
b、启动或者关闭docker
启动docker
sh
sudo service docker start
关闭docker
sh
sudo service docker stop
2、容器操作
a、启动一个镜像
开始运行docker镜像一般使用docker run。
该命令有很多的参数,这里我们介绍一下最常用的部分参数
-i,以交互模式运行容器,通常与 -t 同时使用
-t,启动容器后,为容器分配一个命令行,通常与-i同时使用
-v,目录映射,容器目录挂载到宿主机目录,格式: <host目录>:<容器目录>
-d,守护进程,后台运行该容器
-p,指定端口映射,格式:主机(宿主)端口:容器端口
--name "nginx-lb",容器名字
-e --env username="ritchie",设置环境变量
在这里我给几个例子,看情况进行复制使用即可:
i、后台运行
以后台模式运行一个容器,容器名字为test1,主机的8099端口对应容器环境的80端口,主机的444端口对应容器环境的443端口,默认包含两个环境变量TEST_ENV和TEST_ENV2,分别是1234和12345。
sh
docker run -d --name=test1 8099:80 -p 444:443 -e TEST_ENV=1234 -e TEST_ENV2=12345
这样运行后,会返回一个容器id,此时我们可以通过下述指令进入容器。
sh
docker exec -it 容器id /bin/bash
ii、前台运行
以交互模式运行容器,容器名字为test2,主机的8099端口对应容器环境的80端口,主机的444端口对应容器环境的443端口,默认包含两个环境变量TEST_ENV和TEST_ENV2,分别是1234和12345。本地的/test目录,会挂载到容器的/soft目录中。
sh
docker run -i -t --name=test2 8099:80 -p 444:443 -e TEST_ENV=1234 -e TEST_ENV2=12345 -v /test:/soft
需要注意的是,在离开该容器后,该容器会自动停止。注意,这里的容器只是停止不是销毁。
如果想要容器在运行退出后自动销毁,不再次启动,则可以加上-rm指令,如下所示:
sh
docker run -i -t -rm --name=test2 8099:80 -p 444:443 -e TEST_ENV=1234 -e TEST_ENV2=12345 -v /test:/soft
b、容器运行情况查看
查看当前运行的容器
sh
docker ps
查看全部容器
sh
docker ps -a
查看全部容器及其占用的空间
sh
docker ps -as
c、日志查看
查看日志信息,-f代表Follow log output。
sh
docker logs -f 容器ID
d、容器删除
容器删除一般要先停止容器。
docker stop命令会向运行中的容器发送一个SIGTERM的信号,然后停止所有的进程。
sh
docker stop 容器ID
有些时候SIGTERM不太稳定,会被一些程序给捕捉掉,那么就需要使用docker kill。
docker kill 命令向所有运行在容器中的进程发送了一个不友好的SIGKILL信号。(类似于kill -9)
sh
docker kill 容器ID
容器停止后可以使用下述指令删除容器,这个命令只能对非运行态容器执行。
sh
docker rm 容器ID
3、镜像操作
a、镜像拉取
没什么特别的,直接docker pull即可,下述指令会自动拉取docker中,ubuntu的最新镜像。
其中ubuntu可理解为镜像地址名称,latest可理解为版本号。
sh
docker image pull ubuntu:latest
b、查看已有镜像
使用ls指令即可查看,和正常linux操作类似。
sh
docker image ls
c、镜像删除
使用docker rmi即可删除本地镜像。
sh
docker rmi
d、将正在运行的容器保存为镜像
有些同学可能在容器中做了一些修改,相对其进行保存,那么可以使用docker commit。
sh
docker commit 容器id 镜像名称
e、编译自己的镜像
编译自己的镜像需要基于Dockerfile:
i、Dockerfile.ds编写原则
- Dockerfile中使用的所有文件必须与Dockerfile文件在同一个父目录下;
- Dockerfile中默认的相对路径是Dockerfile所在的目录;
- Dockerfile中,如果一条指令可以写入一行,那么它必须写入一行,因为每条指令被视为一个层,层数越多执行效率就会变慢;
- Dockerfile中,指令不区分大小写,但它们都大写(按照惯例);
- Dockerfile非注释行的第一行必须是FROM;
ii、Dockerfile.ds组成
Dockerfile.ds一般是一个环境的编译文件,由多个部分组成。常用的指令有:
- FROM 基础镜像
- COPY 拷贝文件
- ADD 拷贝文件
- WORKDIR 设置工作目录
- ENV 设置环境变量
- RUN 运行指令
最开始一般是FROM一个基础镜像,比如ubuntu:lastest这这样
sh
FROM <image>:<tag>
然后是拷贝本地的文件或者目录到镜像中。这个一般是使用COPY或者ADD命令。
sh
# 拷贝一个文件
COPY testFile /opt/
# 拷贝一个目录
COPY testDir /opt/testDir
# 拷贝一个文件
ADD testFile /opt/
然后是设置WORKDIR,这个WORKDIR指的是运行该镜像的基础目录,也就是一进来镜像所在的目录。
比如运行下列指令,那么此时在Dockers中,"./"指的就是/opt,进入docker时也会位于/opt。
sh
WORKDIR /opt
然后是设置镜像中的环境变量,使用ENV指令
sh
ENV <key> <value>
有些时候我们需要在镜像构建时安装软件或者删除镜像中的文件,此时可以使用RUN指令。
sh
RUN command1 && command2
iii、Dockerfile.ds示例与编译镜像示例
将下述内容保存为一个Dockerfile.ds。在编译目录下,创建test.py和test2.py两个文件。
sh
# 基于的基础镜像
FROM centos
# 维护者信息
MAINTAINER bubbliiiing
# ADD和COPY test.py和test2.py文件放在当前目录下
ADD test.py /usr/local/
COPY test2.py /usr/local/
# 可以理解为cd,此时/usr/local/为工作目录
WORKDIR /usr/local/
# 设置环境变量
ENV AAA BBB
# 执行以下命令,安装wget,下载redis,并解包。
RUN yum install wget \
&& wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz" \
&& tar -xvf redis.tar.gz
使用下述指令即可开始编译,-t指的是编译后镜像的名称,-f用于指定Dockerfile。
sh
docker build -t build_test:0.0.1 -f Dockerfile.ds .