操作 | 指令 |
---|---|
查看Docker版本 | docker version |
查看docker概要信息 | docker info |
查看docker帮助文档 | docker --help |
官方网站:https://hub.docker.com
搜索镜像命令
docker search 镜像名称
例如:下载centos镜像
查询结果描述:
NAME:镜像名称
DESCRIPTION:镜像描述
STARS:用户评价,反应一个镜像的受欢迎程度
OFFICIAL:是否官方
AUTOMATED:自动构建,表示该镜像由Docker Hub自动构建流程创建的
拉取最新版本命令:
docker pull 镜像
拉取指定版本命令:
docker pull 镜像名称:版本号
查看镜像命令:
docker images
查询结果描述:
REPOSITORY:镜像名称
TAG:镜像标签
IMAGE ID:镜像id
CREATED:镜像的创建日期(不是获取该镜像的日期)
SIZE:镜像大小
删除单个镜像命令:
docker rmi -f 镜像id
删除多个镜像命令:
docker rmi -f 镜像名1:TAG 镜像名2:TAG
docker rmi -f 镜像id1 镜像id2
删除全部镜像命令:
docker rmi -f $(docker iamges -qa)
查看正在运行的容器命令:
docker ps
查看所有容器命令:
docker ps -a
查看最后一次运行的容器命令:
docker ps -l
查看停止的容器命令:
docker ps -f status=exited
创建容器的命令:
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的值。
停止容器命令:
docker stop 容器名称或容器id
启动容器命令:
docker start 容器名称或容器id
重启容器命令:
docker restart 容器名称或容器
强制停止容器命令:
docker kill 容器名称或容器id
将宿主机文件拷贝到容器命令:
docker cp 宿主机需要拷贝的文件或者目录 容器名称:容器目录
例如:
docker cp /tmp/anaconda.log mycentos2:/tmp
将容器文件拷贝到宿主机中命令:
docker cp 容器名称:容器目录或文件 宿主机目录
例如:
docker cp mycentos2:/tmp /export/
可以在创建容器的时候,将宿主机的目录和容器内的目录进行映射,这样就可以通过修改宿主 机的某个目录的文件从而去影响容器。
创建容器添加-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
查看容器ip地址命令:
docker inspect 容器名称或容器id
例如:
docker inspect mycentos3
直接输出IP地址命令:
docker inspect --format=’{{.NetworkSettings.IPAddress}}’ 容器名称或容器id
例如:
docker inspect --format=’{{.NetworkSettings.IPAddress}}’ mycentos3
删除容器命令:
docker rm 容器名称或容器ID
例如:
docker stop mycentos3 (先停止容器才能)
docker rm mycentos3
Dockerfile是由一系列命令和参数构成的脚本,这些命令应用于基础镜像并最终创建一个新的镜像。
对于开发人员:可以为开发团队提供一个完全一致的开发环境;
对于测试人员:可以直接拿开发时所构建的镜像或者通过Dockerfile文件构建一个新的镜像开始工作;
对于运维人员:在部署时,可以实现应用的无缝移植。
从应用软件的角度来看,Dockerfile、Docker镜像与Docker容器分别代表软件的三个不同阶段:
Dockerfile是软件的原材料。
Docker镜像是软件的交付品。
Docker容器则可以认为是软件的运行状态。
Dockerfile面向开发,Docker镜像成为交付标准,Docker容器则涉及部署与运维,三者缺一不可,合力充当Docker体系的基石。
Dockerfile:需要定义一个Dockerfile,Dockerfile定义了进程需要的一切东西。Dockerfile涉及的内容包括执行代码或者是文件、环境变量、依赖包、运行时环境、动态链接库、操作系统的发行版、服务进程和内核进程(当应用进程需要和系统服务和内核进程打交道,这时需要考虑如何设计namespace的权限控制)等等;
Docker镜像:在用Dockerfile定义一个文件之后,docker build时会产生一个Docker镜像,当运行 Docker镜像时,会真正开始提供服务;
Docker容器:容器是直接提供服务的。
命令 | 作用 |
---|---|
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指令,但仅有最后一个会生效。 |
mkdir -p /export/docker/jdk8
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
docker build -t jdk1.8:1.8 .
注意后面的空格和点,不要省略,点表示当前目录,如果当前目录下没有Dockerfile,那么就把点替换成Dockerfile的目录位置。jdk1.8:1.8,冒号前面是镜像名称,后面是镜像的标签。如果没有标签,默认标签为latest。
docker commit 容器名 镜像名
镜像名后面不加冒号和标签,默认标签就是latest。加了就是指定的标签值。
docker save -o xxxx.tar 镜像
-o:表示output,输出的意思
例如:
sudo docker save -o jdk12.tar jdk12:12
会在当前目录下生成xxxx.tar包。
docker load -i xxxx.tar
-i:表示输入的文件,执行后再次查看镜像,可以看到镜像已经恢复
使用docker load -i 命令之后,镜像的名字和标签都是none,这个问题的根本在于这个镜像压缩包在打包的时候操作不当所导致。例如使用镜像ID打包的话导致解压的出来的镜像没有名字。因此,推荐使用镜像的名字进行打包。
如果镜像的名字和标签为空,可以使用以下命令重命名:
docker tag [镜像id] [新镜像名称]:[新镜像标签]