Docker常用命令
镜像的操作
拉取镜像到本地
docker pull 镜像名称[:tag]
https://hub.docker.com/ 搜索镜像
查看全部镜像
docker images
删除本地镜像
docker rmi 镜像ID(IMAGE ID)
修改镜像名称
docker tag 镜像ID 新镜像名称:版本
更新镜像
docker commit -m '镜像描述信息' -a '作者信息' 容器ID 镜像名
保存镜像
docker save centos > 镜像名.tar
载入镜像
docker load < 镜像名.tar
容器的操作
1.运行容器
简单操作
docker run 镜像ID|镜像名称[:tag]
docker run -itd --privileged -v /sys/fs/cgroup:/sys/fs/cgroup --name skyhu4 centos:7 /usr/sbin/init
-v /sys/fs/cgroup:/sys/fs/cgroup 添加映射目录参数 解决systemctl服务不能启动
常用参数docker run -d -p 宿主机端口:容器端口 --name 镜像ID|镜像名称[:tag]
-d 代表后台运行容器
-p 宿主机端口:容器端口:为了映射当前Linux的端口和容器的端口
--name 指定容器名称
--privileged 重要参数,使容器内部能使用主机所有的linux内核功能
2.查看正在运行的容器
docker ps [-qa]
-a:查看全部的容器,包括没有运行
-q:只查看容器的ID
3.查看容器的日志
docker logs -f 容器ID
-f:可以滚动查看日志的最后几行
4.进入到容器内部
docker exec-it 容器ID bash
5.删除容器(删除容器前,需要停止容器)
停止一个容器docker stop 容器ID
停止全部容器docker stop $(docker ps -qa)
删除一个容器docker rm 镜像ID
删除全部容器docker rm $(docker ps -qa)
6.启动容器docker satrt 容器ID
7、查看容器元数据 docker inspect 容器ID
8.检查容器文件的修改 docker diff 容器ID
9. 复制文件到容器内部 docker cp 文件名称 容器ID:容器内部路径
10.查看容器详细信息 docker inspect 容器ID
11.docker --link容器互联nginx连接mysql docker run --name db mysql -d
docker run -itd --name web -p 80:80 --link db:db nginx #--link <容器名>:<别名>
12.docker attach 容器
13. 显示容器正在运行的进程信息 docker top 容器
退出容器
exit ###容器停止退出,缓慢的方式
ctrl+P+Q ###容器不停止退出
Docker应用
运行MySQL容器
docker run -d -p 3306:3306 --name MYSQL_ROOT_PASSWORD=root daocloud.io/libart/mysql:5.7.4
准备运行的项目
project.war
复制到tomcat里
docker cp 文件名称 容器ID:容器内部路径
举个栗子
docker cp project.war TOMCAT:/usr/local/tomcat/webapp
数据卷
# 1.创建数据卷
docker volume create 数据卷名称
# 创建数据卷之后,默认会存放在一个目录下 /var/lib/docker/volume/数据卷名称/_data
# 2.查看数据卷详细信息
docker volume inspect 数据卷名称
# 3.查看全部数据卷
docker volume ls
# 4.删除数据卷
docker volume rm 数据卷名称
# 5.应用数据卷
# 当你映射数据卷时,如果数据卷不存在,Docker会帮你创建。会将容器内部自带的文件,存储在默认的存放路径中。
docker run -v 数据卷名称:容器内部的路径 镜像ID
# 直接指定路径作为数据卷的存放位置,这个链接不是空的。
docker run -v 路径:容器内部的路径 镜像ID
# 举个栗子
docker run -d -p 8080:8080 --name tomcat -v 路径:/usr/local/tomcat/webapp 镜像ID
Docker自定义镜像
Dockerfile的语法非常简单,常用的只有11个
FROM:
FROM {base镜像}
必须放在DOckerfile的第一行,表示从哪个baseimage开始构建
MAINTAINER:
可选的,用来标识image作者的地方
RUN:
每一个RUN指令都会是在一个新的container里面运行,并提交为一个image作为下一个RUN的base
一个Dockerfile中可以包含多个RUN,按定义顺序执行
RUN支持两种运行方式:
RUN <cmd> 这个会当作/bin/sh -c “cmd” 运行
RUN [“executable”,“arg1”,。。],Docker把他当作json的顺序来解析,因此必须使用双引号,而且executable需要是完整路径
而如果需要将两条命令或者多条命令联合起来执行需要加上&&。如:cd /usr/local/src && wget xxxxxxx
CMD:
CMD的作用是作为执行container时候的默认行为(容器默认的启动命令)
当运行container的时候声明了command,则不再用image中的CMD默认所定义的命令
一个Dockerfile中只能有一个有效的CMD,当定义多个CMD的时候,只有最后一个才会起作用
CMD定义的三种方式:
CMD <cmd> 这个会当作/bin/sh -c "cmd"来执行 CMD echo "hello world"
CMD ["executable","arg1",....] 推荐用这种方法 CMD ["/bin/bash","-c","echo 'hello world'"]
CMD ["arg1","arg2"],这个时候CMD作为ENTRYPOINT的参数
Entrypoint:
entrypoint的作用是,把整个container变成了一个可执行的文件,这样不能够通过替换CMD的方法来改变创建container的方式。但是可以通过参数传递的方法影响到container内部
每个Dockerfile只能够包含一个entrypoint,多个entrypoint只有最后一个有效
当定义了entrypoint以后,CMD只能够作为参数进行传递
entrypoint定义方式:
entrypoint ["executable","arg1","arg2"],这种定义方式下,CMD可以通过json的方式来定义entrypoint的参数,可以通过在运行container的时候通过指定command的方式传递参数 推荐用这个方法
entrypoint <cmd>,当作/bin/bash -c "cmd"运行命令 ectrypoint echo 不会传递参数
CMD ["hello world"]
ENTRYPOINT ["echo"]
docker run centos 输出hello worlhd
docker run centos hello skyhu 输出 hello skyhu,作为entrypoint的传参
总结下一般该怎么使用:一般还是会用entrypoint的中括号形式作为docker 容器启动以后的默认执行命令,里面放的是不变的部分,可变部分比如命令参数可以使用cmd的形式提供默认版本,也就是run里面没有任何参数时使用的默认参数。如果我们想用默认参数,就直接run,否则想用其他参数,就run 里面加参数。
cmd 在docker里面的命令 会被外面的docker run 参数替换掉
entrypoint 会把docker run 的参数当传参
EXPOSE 声明端口
格式为 EXPOSE <端口1> [<端口2>...]。
EXPOSE 指令是声明运行时容器提供服务端口,这只是一个声明,在运行时并不会因为这个声明应用就会开启这个端口的服务。在 Dockerfile 中写入这样的声明有两个好处,一个是帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射;另一个用处则是在运行时使用随机端口映射时,也就是 docker run -P 时,会自动随机映射 EXPOSE 的端口。
ADD & COPY:
当在源代码构建的方式下,可以通过ADD和COPY的方式,把host上的文件或者目录复制到image中
ADD和COPY的源必须在context路径下
当src为网络URL的情况下,ADD指令可以把它下载到dest的指定位置,这个在任何build的方式下都可以work
ADD相对COPY还有一个多的功能,能够进行自动解压压缩包
ADD能填加网络文件,并能解压缩tar.gz文件 COPY 不能解压,只能复制
ENV:
ENV key value
用来设置环境变量,后续的RUN可以使用它所创建的环境变量
当创建基于该镜像的container的时候,会自动拥有设置的环境变量
docker run -e Hello=1234 -e 与 --env 相同
WORKDIR:
用来指定当前工作目录(或者称为当前目录)
当使用相对目录的情况下,采用上一个WORKDIR指定的目录作为基准
USER:
指定UID或者username,来决定运行RUN指令的用户
ONBUILD:
ONBUILD作为一个trigger的标记,可以用来trigger任何Dockerfile中的指令
可以定义多个ONBUILD指令
当下一个镜像B使用镜像A作为base的时候,在FROM A指令前,会先按照顺序执行在构建A时候定义的ONBUILD指令
ONBUILD <DOCKERFILE 指令> <content>
VOLUME:
用来创建一个在image之外的mount point,用来在多个container之间实现数据共享
运行使用json array的方式定义多个volume
VOLUME ["/var/data1","/var/data2"]
或者plain text的情况下定义多个VOLUME指令
.dockerignore 文件 在构建dockfile时 排除dockerignore里面写的文件或目录
移动Docker 存储数据的位置。