1、docker常用命令
1.1 帮助命令
操作 | 指令 |
---|---|
查看Docker版本 | docker version |
查看docker概要信息 | docker info |
查看docker帮助文档 | docker --help |
1.2 镜像命令
1.2.1 搜索镜像
-
搜索镜像命令
docker search 镜像名称
例如:下载centos镜像
查询结果描述:
-
NAME:镜像名称
-
DESCRIPTION:镜像描述
-
STARS:用户评价,反应一个镜像的受欢迎程度
-
OFFICIAL:是否官方
-
AUTOMATED:自动构建,表示该镜像由Docker Hub自动构建流程创建的
1.2.2 拉取镜像
拉取最新版本命令:
docker pull 镜像
拉取指定版本命令:
docker pull 镜像名称:版本号
1.2.3 查看镜像
查看镜像命令:
docker images
查询结果描述:
-
REPOSITORY:镜像名称
-
TAG:镜像标签
-
IMAGE ID:镜像id
-
CREATED:镜像的创建日期(不是获取该镜像的日期)
-
SIZE:镜像大小
1.2.4 删除镜像
删除单个镜像命令:
docker rmi -f 镜像id
删除多个镜像命令:
docker rmi -f 镜像名1:TAG 镜像名2:TAG
docker rmi -f 镜像id1 镜像id2
删除全部镜像命令:
docker rmi -f $(docker iamges -qa)
1.3 容器命令
1.3.1 查看容器
查看正在运行的容器命令:
docker ps
查看所有容器命令:
docker ps -a
查看最后一次运行的容器命令:
docker ps -l
查看停止的容器命令:
docker ps -f status=exited
1.3.2 创建与启动容器
创建容器的命令:
docker run
常用的参数说明:有些是一个减号,有些是两个减号
-
–-name=“容器新名字”: 为容器指定一个名称;
-
-d:在run后面加上参数-d,会创建一个守护式容器在后台运行(这样创建容器后不会自动登录容器,如果只加-i-t两个参数,创建后会自动进入容器),并返回容器ID,也即启动守护式容器;
-
-i:以交互模式运行容器,通常与 -t 同时使用;
-
-t:表示容器启动后会进入其命令行,为容器重新分配一个伪输入终端,通常与 -i 同时使用;
-
-e:代表添加环境变量;
-
-p: 表示端口映射,有以下四种格式:
-
ip:hostPort:containerPort
-
ip::containerPort
-
hostPort:containerPort
-
containerPort
-
前者表示宿主机端口,后者是容器内的映射端口,可以使用多个-p做多个端口映射
-
启动交互式容器命令:
docker run -it --name=容器名称 镜像名称:标签 /bin/bash
命令执行后直接进入了容器内部,/bin/bash的作用是因为docker后台必须运行一个进程,否则容器就会退出,在这里表示启动容器后启动bash。有些镜像默认的shell环境不是/bin/bash,要看Dockerfile中CMD的值。
退出当前容器命令:
exit
守护式容器创建命令:
docker run -d --name=容器名称 镜像名称:标签
守护式容器含义:能够长期运行、没有交互式会话、适合运行应用程序和服务。
登录守护式容器命令:
docker exec -it 容器名称(或者容器id) /bin/bash
有些镜像默认的shell环境不是/bin/bash,要看Dockerfile中CMD的值。
1.3.3 停止与启动容器
停止容器命令:
docker stop 容器名称或容器id
启动容器命令:
docker start 容器名称或容器id
重启容器命令:
docker restart 容器名称或容器
强制停止容器命令:
docker kill 容器名称或容器id
1.3.4 文件拷贝
将宿主机文件拷贝到容器命令:
docker cp 宿主机需要拷贝的文件或者目录 容器名称:容器目录
例如:
docker cp /tmp/anaconda.log mycentos2:/tmp
将容器文件拷贝到宿主机中命令:
docker cp 容器名称:容器目录或文件 宿主机目录
例如:
docker cp mycentos2:/tmp /export/
1.3.5 目录挂载
可以在创建容器的时候,将宿主机的目录和容器内的目录进行映射,这样就可以通过修改宿主 机的某个目录的文件从而去影响容器。
创建容器添加-v参数,后边为宿主机目录:容器目录,例如:
docker run -di -v /root/data01/:/data01 --name=centos7 centos:7
挂载之后,往宿主机的目录/root/data01中存放文件,在容器centos7的目录/data01下也能看到存放的文件。
如果共享的是多级的目录,可能会出现权限不足的提示,我们需要添加参数–privileged=true来解决挂载的目录没有权限的问题,命令如下:
docker run -di --privileged=true -v /usr/local/myhtml:/usr/local/myhtml --name=mycentos7 centos:7
1.3.6 查看容器ip地址
查看容器ip地址命令:
docker inspect 容器名称或容器id
例如:
docker inspect mycentos3
直接输出IP地址命令:
docker inspect --format=’{{.NetworkSettings.IPAddress}}’ 容器名称或容器id
例如:
docker inspect --format=’{{.NetworkSettings.IPAddress}}’ mycentos3
1.3.7 删除容器
删除容器命令:
docker rm 容器名称或容器ID
例如:
docker stop mycentos3 (先停止容器才能)
docker rm mycentos3
1.4 镜像的构建与迁移
1.4.1 Dockerfile
1.4.1.1 介绍
Dockerfile是由一系列命令和参数构成的脚本,这些命令应用于基础镜像并最终创建一个新的镜像。
-
对于开发人员:可以为开发团队提供一个完全一致的开发环境;
-
对于测试人员:可以直接拿开发时所构建的镜像或者通过Dockerfile文件构建一个新的镜像开始工作;
-
对于运维人员:在部署时,可以实现应用的无缝移植。
1.4.1.2 Dockerfile构建步骤
- 编写Dockerfile文件。
- docker build。
- docker run。
1.4.2 DockerFile 构建过程解析
1.4.2.1 Dockerfile 内容基础知识
- 每条保留字指令都必须为大写字母且后面要跟随至少一个参数。
- 指令按照从上到下,顺序执行。
- #表示注释。
- 每条指令都会创建一个新的镜像层,并对镜像进行提交。
1.4.2.2 Docker 执行Dockerfile大致流程
- docker从基础镜像运行一个容器。
- 执行一条指令并对容器作出修改。
- 执行类似docker commit的操作提交一个新的镜像层。
- docker再基于刚提交的镜像运行一个新容器。
- 执行dockerfile中的下一条指令直到所有指令都执行完成。
1.4.2.3 总结
从应用软件的角度来看,Dockerfile、Docker镜像与Docker容器分别代表软件的三个不同阶段:
-
Dockerfile是软件的原材料。
-
Docker镜像是软件的交付品。
-
Docker容器则可以认为是软件的运行状态。
-
Dockerfile面向开发,Docker镜像成为交付标准,Docker容器则涉及部署与运维,三者缺一不可,合力充当Docker体系的基石。
-
Dockerfile:需要定义一个Dockerfile,Dockerfile定义了进程需要的一切东西。Dockerfile涉及的内容包括执行代码或者是文件、环境变量、依赖包、运行时环境、动态链接库、操作系统的发行版、服务进程和内核进程(当应用进程需要和系统服务和内核进程打交道,这时需要考虑如何设计namespace的权限控制)等等;
-
Docker镜像:在用Dockerfile定义一个文件之后,docker build时会产生一个Docker镜像,当运行 Docker镜像时,会真正开始提供服务;
-
Docker容器:容器是直接提供服务的。
1.4.3 常用命令
命令 | 作用 |
---|---|
FROM image_name:tag | 定义了使用哪个基础镜像启动构建流程。 |
MAINTAINER user_name | 声明镜像的创建者,创建者的用户名和邮箱地址。 |
ENV key value | 设置环境变量(可以写多条),例如:ENV MYSQL_ROOT_PASSWORD 123456 、ENV JAVA_HOME /usr/local/jdk1.8.0_45。 |
RUN command | 是Dockerfile的核心部分(可以写多条),例如:RUN yum install httpd。 |
ADD source_dir/file dest_dir/file | 将宿主机的文件复制到容器内,如果是一个压缩文件,将会自动解压。 |
COPY source_dir/file dest_dir/file | 和ADD相似,但是如果有压缩文件并不能自动解压。 |
WORKDIR path_dir | 为RUN、CMD、ENTRYPOINT以及COPY和AND设置工作目录,例如:WORKDIR /data。 |
VOLUME | 指定容器挂载点到宿主机自动生成的目录或其他容器,例如:VOLUME [“/var/lib/mysql”]。PS:一般不会在Dockerfile中用到,更常见的还是在docker run的时候指定-v数据卷。 |
CMD | 启动容器时执行的Shell命令,例如:CMD [“-C”, “/start.sh”]、CMD [“/usr/sbin/sshd”, “-D”]、CMD /usr/sbin/sshd -D。 |
EXPOSE | 声明容器运行的服务端口,例如:EXPOSE 80 443 。 |
ENTRYPOINT | 启动容器时执行的Shell命令,同CMD类似,只是由ENTRYPOINT启动的程序不会被docker run命令行指定的参数所覆盖,而且这些命令行参数会被当作参数传递给ENTRYPOINT指定指定的程序。 ENTRYPOINT [“/bin/bash”, “-C”, “/start.sh”]、ENTRYPOINT /bin/bash -C ‘/start.sh’。PS:Dockerfile文件中也可以存在多个ENTRYPOINT指令,但仅有最后一个会生效。 |
1.4.4 使用脚本创建镜像
1.4.4.1 编写Dockerfile
- 创建目录
mkdir -p /export/docker/jdk8
- 将jdk-8u241-linux-x64.tar.gz上传到服务器(虚拟机)中的/export/docker/jdk8目录
- 创建文件Dockerfile
cd /export/docker/jdk8/
vi Dockerfile
#依赖镜像名称和id
FROM centos:latet
#指定镜像创建者信息
MAINTAINER ITCAST
#切换工作目录
WORKDIR /usr
RUN mkdir /usr/local/java
#ADD 是相对路径jar,把java添加到容器中
ADD jdk-8u221-linux-x64.tar.gz /usr/local/java
#配置java环境变量
ENV JAVA_HOME /usr/local/java/jdk1.8.0_221
ENV PATH $JAVA_HOME/bin:$PATH
1.4.4.2 构建镜像
docker build -t jdk1.8:1.8 .
注意后面的空格和点,不要省略,点表示当前目录,如果当前目录下没有Dockerfile,那么就把点替换成Dockerfile的目录位置。jdk1.8:1.8,冒号前面是镜像名称,后面是镜像的标签。如果没有标签,默认标签为latest。
1.4.5 Docker 迁移与备份
1.4.5.1 容器保存为镜像
- 通过以下命令将容器保存为镜像
docker commit 容器名 镜像名
镜像名后面不加冒号和标签,默认标签就是latest。加了就是指定的标签值。
1.4.5.2 镜像备份
- 通过以下命令将镜像保存为tar文件
docker save -o xxxx.tar 镜像
-o:表示output,输出的意思
例如:
sudo docker save -o jdk12.tar jdk12:12
会在当前目录下生成xxxx.tar包。
1.4.5.3 镜像恢复与导入
- 使用此命令进行恢复镜像
docker load -i xxxx.tar
-i:表示输入的文件,执行后再次查看镜像,可以看到镜像已经恢复
使用docker load -i 命令之后,镜像的名字和标签都是none,这个问题的根本在于这个镜像压缩包在打包的时候操作不当所导致。例如使用镜像ID打包的话导致解压的出来的镜像没有名字。因此,推荐使用镜像的名字进行打包。
如果镜像的名字和标签为空,可以使用以下命令重命名:
docker tag [镜像id] [新镜像名称]:[新镜像标签]