docker 客户端非常简单 ,我们可以直接输入 docker 命令来查看到 Docker 客户端的所有命令选项。可以通过命令 docker command –help 更深入的了解指定的 Docker 命令使用方法。 例如我们要查看 docker stats 指令的具体使用方法:
docker查找镜像 1 2 3 4 5 6 7 docker search 镜像名称 docker search --filter "is-official=true" centos docker search -f is-official=true centos
docker 安装镜像 1 2 3 4 5 6 7 8 docker pull 镜像名称:标签 docker pull tomcat:8 docker pull mysql:5.7
删除images 1 2 3 4 5 6 7 8 9 docker rmi imgId docker rm containerId docker rmi imgId
启动容器 以下命令使用 ubuntu 镜像启动一个容器,参数为以命令行模式进入该容器:
1 2 3 4 5 6 7 8 9 10 11 docker run <相关参数> <镜像 ID> <初始命令> docker run -itd --name 自定义容器名称 镜像名称:标签 shell docker run -p 8080:8080 --name mytomcat tomcat:8 docker run -itd ubuntu /bin/bash
参数说明:
-i: 交互式操作。
-t: 终端。
-d:指定容器的运行模式为后台运行。
-P:是容器内部端口随机映射到主机的高端口。
-p: 是容器内部端口绑定到指定的主机端口。
–name: 标识来命名容器。
ubuntu: ubuntu 镜像。
/bin/bash:放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 /bin/bash。
-v:表示需要将本地哪个目录挂载到容器中,格式:-v <宿主机目录>:<容器目录>
需要说明的是,不一定要使用“镜像 ID”,也可以使用“仓库名:标签名”,例如:centos:latest。 初始命令表示一旦容器启动,需要运行的命令,此时使用“/bin/bash”,表示什么也不做,只需进入命令行即可。
1 2 3 4 5 6 docker run -d --name mysql5.7 -p 3306:3306 -v /usr/local /mysql/data:/var/lib/mysql -v /usr/local /mysql/conf.d:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7.25 docker run -it --privileged=true -v /F/javaResource/:/usr/local /src/ 5e35e350aded /bin/bash
要退出终端,直接输入 exit: 通过 docker inspect 命令,我们可以获取镜像的详细信息,其中,包括创建者,各层的数字摘要等。 1 2 3 4 5 6 docker inspect repository:tag docker inspect mysql:5.7 docker inspect 返回的是 JSON 格式的信息,如果您想获取其中指定的一项内容,可以通过 -f 来指定,如获取镜像大小: docker inspect -f {{".Size" }} mysql:5.7
容器其他命令 1 2 3 4 5 6 7 8 9 10 11 12 13 14 docker ps docker ps -a docker stop containerId docker start containerId docker restart containerId
进入容器 在使用 -d 参数时,容器启动后会进入后台。此时想要进入容器,可以通过以下指令进入:
docker attach
docker exec:推荐大家使用 docker exec 命令,因为此退出容器终端,不会导致容器的停止。
1 docker exec -it mytomcat bash
什么是 Dockerfile Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。
FROM:定制的镜像都是基于 FROM 的镜像,这里的 nginx 就是定制需要的基础镜像。后续的操作都是基于 nginx。
RUN:用于执行后面跟着的命令行命令。有以下俩种格式:
1 2 3 4 5 6 7 8 RUN <命令行命令> RUN ["可执行文件" , "参数1" , "参数2" ]
注意:Dockerfile 的指令每执行一次都会在 docker 上新建一层。所以过多无意义的层,会造成镜像膨胀过大。例如:
1 2 3 4 FROM centos RUN yum install wget RUN wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz" RUN tar -xvf redis.tar.gz
以上执行会创建 3 层镜像。可简化为以下格式:
1 2 3 4 FROM centos 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
如上,以 && 符号连接命令,这样执行后,只会创建 1 层镜像。
开始构建镜像 在 Dockerfile 文件的存放目录下,执行构建动作。
以下示例,通过目录下的 Dockerfile 构建一个 tomcat和jdk整合的镜像:v1(镜像名称:镜像标签) 注:最后的 . 代表本次执行的上下文路径,下一节会介绍。
构建镜像命令 1 2 3 4 5 6 docker build -t name:tag . -t 镜像的名字及标签,通常 name:tag 或者 name 格式;可以在一次构建中为一个镜像设置多个标签。 docker build -t javawebenv:v1 .
Dockerfile内容 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 FROM centos:7 MAINTAINER samdockerdeveloper RUN mkdir -p /usr/local /tomcat7 \ &&mkdir -p /usr/local /jdk8 WORKDIR /usr/local /src/ COPY apache-tomcat-7.0.99.zip /usr/local /src/ COPY jdk-8u131-linux-x64.tar.gz /usr/local /src/ COPY my.cnf /usr/local /src/ RUN yum update -y \ &&yum install -y unzip \ &&unzip apache-tomcat-7.0.99.zip \ &&rpm --import /etc/pki/rpm-gpg/RPM* \ &&cp -R apache-tomcat-7.0.99/* /usr/local /tomcat7 \ &&chmod +x /usr/local /tomcat7/bin/*.sh \ &&tar -xf jdk-8u131-linux-x64.tar.gz -C /usr/local /jdk8 --strip-components 1 ENV JAVA_HOME /usr/local /jdk8 ENV CLASSPATH $JAVA_HOME /lib/dt.jar:$JAVA_HOME /lib/tools.jar ENV CATALINA_HOME /usr/local /tomcat7 ENV CATALINA_BASE /usr/local /tomcat7 ENV PATH $PATH :$JAVA_HOME /bin:$CATALINA_HOME /lib:$CATALINA_HOME /bin EXPOSE 8080 ENTRYPOINT ["/usr/local/tomcat7/bin/catalina.sh" ,"run" ]
上下文路径,是指 docker 在构建镜像,有时候想要使用到本机的文件(比如复制),docker build 命令得知这个路径后,会将路径下的所有内容打包。
解析:由于 docker 的运行模式是 C/S。我们本机是 C,docker引擎是S。实际的构建过程是在docker引擎下完成的,所以这个时候无法用到我们本机的文件。这就需要把我们本机的指定目录下的文件一起打包提供给 docker 引擎使用。
如果未说明最后一个参数,那么默认上下文路径就是 Dockerfile 所在的位置。 注意:上下文路径下不要放无用的文件,因为会一起打包发送给 docker 引擎,如果文件过多会造成过程缓慢。
使用的过程中遇到的问题 1 2 3 4 5 6 7 8 9 10 11 12 Docker报错“Dockerfile parse error line 1: FROM requires either one or three arguments” 看官方文档Format: 以'#' 开头一行被视为评论,出现在其他位置视为参数,也就不难理解报错原因:将写在同一行的注释视为参数了。 Failed to get D-Bus connection: Operation not permitted /etc/init.d/mysqld: 启动命令 docker run -d -p 8080:8080 -v /root/webapps:/usr/local /tomcat7/webapps --name mycentos mycentos:7 /bin/bash 以特权模式运行容器 启动命令改成 docker run -d -p 8080:8080 -v /root/webapps:/usr/local /tomcat7/webapps --name mycentos mycentos:7 /usr/sbin/init /etc/sysconfig/network 文件夹不存在 编辑/etc/init.d/mysqld 中的 . /etc/sysconfig/network 修改成/etc/sysconfig/network-scripts/ifcfg-lo或者用软连接 ln -s /etc/sysconfig/network-scripts/ifcfg-lo /etc/sysconfig/network