docker:xxx代表id
加入开机
systemctl enable docker
启动/停止/重启docker
systemctl start/stop/restart docker
启动docker
镜像:
拉取centos镜像默认是最新版:
docker pull centos
查看镜像:
docker images
删除镜像:f表示强制删除,f后面可跟镜像id或者镜像名称,rmi的i就是image的意思
docker rmi -f centos
查看镜像id:
docker images -qa
容器:
新建并启动镜像:
docker run -it --name mycentos centos
i代表交互,t代表伪终端,name给容器起一个别名
docker run -it centos /bin/bash
启动tomcat
docker run -it -p 8888:8080 tomcat
小写的p代表指定端口号,8888代表docker对外映射的端口8080代表tomcat内部的端口,直接访问8888端口
docker run -it -P 8888:8080 tomcat
大写的P代表随机端口
提交修改的容器为新镜像
docker commit -a='rt' -m='mv webapps' 0e37242e82de rt/tomcat:1.1
-a代表作者
-m代表修改内容
rt/tomcat:1.1新城的镜像名和版本号
再次启动自己新提交的镜像
docker run -d -P rt/tomcat:1.1
必须带版本号否则会去找latest版本
后台启动镜像
docker run -d centos
执行完docker ps发现并未找到运行的镜像,是因为docker后台运行就必须有一个前台进程,执行完上面的命令镜像启动之后发现前台没有进程就立即自杀了。
模拟前台进程启动:
docker run -d centos /bin/sh -c "while true;do echo hello world;sleep 5;done"
启动centos镜像,循环每5秒打印一次hello world
查看容器的日志
docker logs -t -f --tail 3 XXX
-t 显示时间
-f 追加持续输出
--tail 最后3行
查看容器内的进程
docker top XXX
和linux下的top类似
查看容器内的信息
docker inspect XXX
查看当前正在运行的容器
docker ps
查看当前运行的容器的id
docker ps -q
查看历史运行的容器id
docker ps -qa
停止容器:直接退出
exit
离开容器但不停止:先按ctrl再按p再按q,按照顺序来,不是一下按三个
ctrl+p+q
再次进入
docker attach XXX
退出用ctrl+p+q
直接查看容器内的东西不进入容器
docker exec -t adf5a74ec0e6 ls -l /tmp
查看/tmp下的文件信息
也可以直接进入
docker exec -it adf5a74ec0e6 /bin/bash
复制容器内的文件在主机上
docker cp adf5a74ec0e6:/tmp/a.txt /tmp
复制adf5a74ec0e6容器下tmp目录中的a.txt文件到主机tmp文件下。
注意冒号后没空格
重启/停止/强制停止容器:XXX代表容器id
docker restart/stop/kill XXX
查看历史运行过的容器
docker ps -a
删除历史记录中已经停止的容器:XXX代表容器id
docker rm XXX
强制删除容器:先关再删
docker rm -f XXX
一次性删除多个容器
docker rm -f ${docker ps -qa}
或者
docker ps -qa | xargs docker rm
管道符前面代表参数,传递给管道符后面的xargs中,然后执行删除
重启历史运行过已退出的容器:XXX代表容器id不是镜像id
docker start XXX
容器数据卷
命令共享数据: 主机的目录为根目录下不行,换到tmp下可以不知道是不是docker版本的问题
docker run -it -v /tmp/myDataCentos:/myDataCentosContainer XXX
互相可读可写
-v数据卷
myDataCentos:主机上的目录
myDataCentosContainer:容器内的目录
XXX:容器id/名称
docker run -it -v /tmp/myDataCentos:/myDataCentosContainer:ro XXX
ro:容器文件夹只读,不允许自己写,可以同步主机文件夹的内容
-v数据卷
myDataCentos:主机上的目录
myDataCentosContainer:容器内的目录
XXX:容器id/名称
Dockerfile用法
编写Dockerfile文件
FROM centos
#继承自centos镜像
VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]
#根目录下创建2个文件夹
CMD echo "finished,---------------success"
#输出
CMD /bin/bash
#执行
build一下
docker build -f /mydocker/Dockerfile -t rt/centos .
#注意结尾的点后别忘记
启动刚才新建的镜像就会默认在根目录下生成2个文件夹,docker inspect XXX 进入刚才启动的容器内,找Dockerfile内配的文件夹,会看到主机对应的文件夹。
容器间通讯
先启动一个容器叫d1。
docker run -it --name d1 rt/centos
启动第二个容器叫d2,volumes-from代表卷来源于d1。
docker run -it --name d2 --volumes-from d1 rt/centos
重点:删除任何一个容器,其他容器间的通讯还会一直保持,直到全部容器被删除。
DockerFile体系结构
FROM :基础镜像,当前新镜像是基于哪个镜像的
MAINTAINER:镜像维护者的姓名和邮箱地址
RUN:容器构建时需要运行的命令
EXPOSE:当前容器对外暴露出的端口
WORKDIR:指定在创建容器后,终端默认登陆的进来工作目录,一个落脚点
ENV:用来在构建镜像过程中设置环境变量
ADD:将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar压缩包=copy+解压缩
COPY:类似ADD,拷贝文件和目录到镜像中。
VOLUME:容器数据卷,用于数据保存和持久化工作
CMD:指定一个容器启动时要运行的命令-会被覆盖
ENTRYPOINT:指定一个容器启动时要运行的命令-会追加
ONBUILD:当构建一个被继承的Dockerfile时运行命令,父镜像在被子继承后父镜像的onbuild被触发
Dockerfile示例
FROM centos
MAINTAINER xxx@qq.com
COPY a.txt /tmp/container.txt
ADD b.tar.gz /tmp/
RUN yum -y install vim
ENV MYPATH /tmp
WORKDIR $MYPATH
EXPOSE 8080
查看历史镜像
docker history XXX