Docker
参考:
https://www.cnblogs.com/reasonzzy/p/11127296.html
Docker 三大组件
-
Images(镜像):
Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统
-
Containers(容器):
镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
-
Repository(仓库):
仓库可看成一个代码控制中心,用来保存镜像。
安装
通过whereis docker
查看docker的安装目录
-
按照官网步骤安装
注意国内需要使用阿里云的docker镜像否则安装docker非常慢
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
如果出现无法安装
yum clean all && yum makecache
-
如果无法运行
docker run hello-world
配置镜像加速
sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://u6p3j4k6.mirror.aliyuncs.com"] } EOF sudo systemctl daemon-reload sudo systemctl restart docker
-
重启docker
systemctl restart docker //重启 systemctl start docker //启动
-
验证
docker run hello-world
-
设置开机自启
systemctl enable docker
镜像命令
https://www.runoob.com/docker/docker-tutorial.html
镜像下载位置
usr/local/docker
-
docker --help
-
docker -v
显示版本 -
docker info
查看docker 具体信息 -
docker images
列出本地镜像
-
docker search [IMAGENAME]
搜索dockerHub上的资源 -
docker pull [IMAGENAME]:[TAG]
默认拉取最新的,如果需要指定版本,例如docker pull mysql:5.7
-
docker rmi (-f) [IMAGENAME]:[latest]
删除镜像
-f 强制删除
使用docker rmi -f $(docker images -qa)
删除所有镜像,$()复合命令
容器命令
容器其实就是一个精简的linux系统
容器重启后不会保留数据,如需要保留数据使用容器卷
如果返回container id,表示操作成功
如果没用和容器交互docker会自动关闭容器,可以通过ctrl+p+q挂起当前容器
-
docker run [option] IMAGE:[TAG]
运行容器
-it :容器终端交互
docker run -it centos /bin/bash
(/bin/bash可以省略)
-d :以守护线程的模式运行
--name: 给运行的容器起一个别名
-p:指定外部端口对应容器中的端口-v: 挂载容器卷
-
docker attach CONTAINERID
进入容器内部, 如果以这种方式退出容器,容器就会自动关闭 -
docker exec -it CONTAINERID /bin/bash
docker exec -it redis /bin/bash redis-cli
容器运行成功后,容器运行redis-cli
命令推荐使用
进入容器内部,如果以这种方式退出容器,容器不会自动关闭
-
docker ps [option]
查看正在运行的容器
-a: 列出所有正在运行的和历史上运行过的
-l: 显示最近运行的容器
-n :显示最近n个运行过的容器
-q :静默模式,只显示正在运行的容器编号docker ps CONTAINERID
查看具体的容器 -
docker start CONTAINERID
启动container -
docker restart CONTAINERID
重启container -
docker stop CONTAINERID
正常停止container -
docker kill CONTAINERID
强制停止container -
docker rm [option] CONTAINERID
删除停止运行的container
-f :强制删除docker rm -f $(docker ps -q)
删除所有运行的containerdocker rm -f $(docker ps -qa)
删除所有container -
docker logs [option] CONTAINERID
查看docker日志
-t :加入时间戳
-f :跟随最新的日志打印,不停追加日志
--tail: 显示最后多少条
docker logs -tf --tail 3 1b69245f0f61
不停追加显示倒数三行日志 -
docker inspect CONTAINERID
查看容器内部细节(json串显示)注意新版的镜像挂载点的映射在Mounts中
-
docker cp [OPTIONS] container:src_path dest_path
docker cp [OPTIONS] dest_path container:src_path容器与宿主机之间文件拷贝
将主机/www/runoob目录拷贝到容器96f7f14e99ab的/www目录下。 docker cp /www/runoob 96f7f14e99ab:/www/ 将主机/www/runoob目录拷贝到容器96f7f14e99ab中,目录重命名为www。 docker cp /www/runoob 96f7f14e99ab:/www 将容器96f7f14e99ab的/www目录拷贝到主机的/tmp目录中。 docker cp 96f7f14e99ab:/www /tmp/
-
docker history CONTAINTERID
查看镜像变更记录
自定义镜像commit
注意容器不能退出,否则容器会还原,需要使用ctrl+p+q
挂起容器
- docker commit -m"" -a"" CONTAINERID [name]:[version]
提交修改过的docker image到本地仓库
-m :消息message
-a :作者author
name: 自定义新容器的image名字
version: 自定义新容器的version
运行自定义的镜像要指定版本
数据容器卷
数据卷
将容器中的指定文件挂载到宿主机
容器与宿主机数据共享,容器重启后,宿主机中的数据同样会与容器共享
docker run -it -v [HOST PATH]:[COTAINER PATH] [CONTAINERID]
-v volume 创建数据容器卷
docker run -it -v /mydata:/data:ro [CONTAINERID]表示容器内的文件只允许read
通过docekr inspect CONTAINERID
查看是否挂载
容器卷
docker run -it --volumes-form [parentcontainerid] --name [alis]
只要是同一个镜像创建的容器通过--volumes-form, 容器之间数据共享,类似于Maven的组合
只要容器没有关闭完,即使一个容器退出,并不影响容器间数据共享
DockFile
参考:
https://www.cnblogs.com/edisonchou/p/dockerfile_inside_introduction.html
在当前目录下创建一个名为Dockerfile的文件,并写入
#基于centos镜像
FROM centos
#维护人的信息
MAINTAINER The CentOS Project <303323496@qq.com>
#安装httpd软件包
RUN yum -y update
RUN yum -y install httpd
#开启80端口
EXPOSE 80
#复制网站首页文件至镜像中web站点下
ADD index.html /var/www/html/index.html
#复制该脚本至镜像中,并修改其权限
ADD run.sh /run.sh
RUN chmod 775 /run.sh
#当启动容器时执行的脚本文件
CMD ["/run.sh"]
通过Docker创建一个本地的镜像
docker build -t [IMAGENAME] PATH
-t 指定Dockfile生成镜像的名字
-f 默认Dockerfile
PATH Dockerfile所在位置
As Follow
docekr -t [tom:hiton] .
通过当前目录下名为Dockerfile的配置文件,创建一个名为tom,版本为hiton的镜像
Dockefile常用命令
-
FORM
指明构建的新镜像是来自于哪个基础镜像,例如:
FROM centos
-
LABEL
LABEL maintainer指定镜像作者
LABEL maintainer="edisonzhou.cn"
-
RUN
构建镜像时容器中运行的Shell命令,例如
RUN ["yum", "install", "httpd"] RUN yum install httpd
又如,我们在使用微软官方ASP.NET Core Runtime镜像时往往会加上以下RUN命令,弥补无法在默认镜像下使用Drawing相关接口的缺憾:
FROM microsoft/dotnet:2.2.1-aspnetcore-runtime #并列的RUN可以化简为&& RUN apt-get update && apt-get install -y libgdiplus && apt-get install -y libc6-dev && ln -s /usr/lib/libgdiplus.so /lib/x86_64-linux-gnu/libgdiplus.so
-
CMD
启动容器时执行宿主机Shell命令,一般采用
CMD /bin/bash
, 这样通过docker run 就不需要添加/bin/bash
命令CMD ["-D", "/usr/sbin/sshd"] CMD ["/usr/sbin/sshd", "-D"] CMD /usr/sbin/sshd -D CMD ["curl","-s","http://ip.cn"]
如果有多个CMD只会运行最后一个CMD,且会被命令行覆盖例如:
FROM tomcat ... CMD ["catalina.sh","run"] -------- $ docker run -it tomcat ls -l
docker run
命令行中的ls -l
覆盖了Dockerfile中最后一个CMD
命令 -
ENTRYPOINT
启动容器时执行的Shell命令,同CMD类似,只是由ENTRYPOINT启动的程序不会被docker run命令行指定的参数所覆盖,而且,这些命令行参数会被当作参数传递给ENTRYPOINT指定指定的程序,例如:
ENTRYPOINT ["/bin/bash", "-C", "/start.sh"] ENTRYPOINT /bin/bash -C '/start.sh'
FROM centos RUM yum install -y curl ENTRYPOINT ["curl", "-s", "http://ip.cn"] -------- $docker run -it tomcat -i #会将参数拼接 ["curl","-si","http://ip.cn"]
CMD和ENTYPOINT会在docker ps
中显示
-
EXPOSE
声明容器运行的服务端口,例如:
EXPOSE 8080
-
ADD
拷贝文件或目录到镜像中,例如:
如果是URL或压缩包,会自动下载或自动解压。
ADD <src>...<dest> ADD html.tar.gz /var/www/html ADD https://xxx.com/html.tar.gz /var/www/html
-
COPY
拷贝文件或目录到镜像中,用法同ADD,只是不支持自动下载和解压,例如:
COPY ./start.sh /start.sh
-
VOLUME
指定容器挂载点到宿主机(自动生成的目录,通过
docker inspect
查看)或其他容器,例如:VOLUME ["/var/lib/mysql"] #容器内的路径
-
ENV
设置环境内环境变量,例如:
在Dockerfile中可以使用定义变量
ENV MYSQL_ROOT_PASSWORD 123456 ENV JAVA_HOME /usr/local/jdk1.8.0_45 ENV <key1>=<value1> <key2>=<value2>... WORKDIR $JAVA_HOME #$表示引用变量
As Follow
ENV NODE_VERSION 7.2.0 #可以在引号内使用 RUN curl -SLO "https://nodejs.org/dist/v$NODE_VERSION/node-v$NODE_VERSION-linux-x64.tar.xz" \ && curl -SLO "https://nodejs.org/dist/v$NODE_VERSION/SHASUMS256.txt.asc"
-
WORKDIR
为RUN、CMD、ENTRYPOINT以及COPY和AND设置工作目录, 进入容器后的目录
WORKDIR /data
-
ONBUILD
用于延迟构建命令的执行。简单的说,就是 Dockerfile 里用 ONBUILD 指定的命令,在本次构建镜像的过程中不会执行(假设镜像为 test-build)。当有新的 Dockerfile 使用了之前构建的镜像 FROM test-build ,这是执行新镜像的 Dockerfile 构建时候,会执行 test-build 的 Dockerfile 里的 ONBUILD 指定的命令。
格式:
#father FROM tomcat ... ONBUILD echo "hello world" $docker buidl -t father . ------- #son FROM father #使用父容器 ... $docker build -t son #创建镜像时会触发父容器的ONBUILD