wget https://download.docker.com/linux/centos/docker-ce.repo -P /etc/yum.repos.d yum install -y docker-ce systemctl start docker systemctl enable docker
yum install -y epel-release yum install -y docker-compose --enablerepo=epel
docker search
docker pull centos
docekr images
docker rmi
#以交互模式 docker run --name=centos-test -it img-name /bin/bash #以守护模式 docker run --name=centos-test -itd img-name /bin/bash #进入容器 docker exec -it continer-name /bin/bash
docker ps #查看启动的容器 docker ps -a #查看所有容器
docker start name(id) #启动 docekr stop name(id) #停止 docker rm name(id) #删除 docker rm -f name(id) #停止并删除容器
docker run --name=nginx-test1 -p 80 -itd nginx:1.16.1 /bin/bash docker run --name=nginx-test2 -p 10080:80 -itd nginx:1.16.1 /bin/bash #-P 随机映射 #-p 指定映射,外部端口:内部端口 如:10080:80 即将宿主机的10080映射为容器内部的80端口
FROM centos
MAINTAINER name
RUN #1.shell模式 RUN <comm> (shell模式,最常用) 如:RUN /bin/bash -c command #2.RUN [“可执行命令”,“参数1”,“参数2”](exec模式) 如:RUN [“/bin/bash”,”-c”,”echo hello”]
EXPOSE port1 port2 #EXPOSE 仅仅是暴露一个端口,一个标识,在没有定义任何端口映射时,外部是无法访问到容器提供的服务
CMD command param1 param2 (shell模式) #CMD 指令的首要目的在于为启动的容器指定默认要运行的程序,程序运行结束,容器也就结束;注意: CMD 指令指定的程序可被 docker run 命令行参数中指定要运行的程序所覆盖。 #CMD 指令:类似于 RUN 指令,用于运行程序,但二者运行的时间点不同;CMD 在docker run 时运行,而非docker build; #每个 Dockerfile 只能有一条,如果有多条则只有最后一条被执行
# ENTRYPOINT 指令:类似于 CMD 指令,但其不会被 docker run 的命令行参数指定的指令所覆盖,而且这些命令行参数会被当作参数送给
ADD <源>...<目的地> #ADD包含类似tar的解压功能 COPY <源>...<目的地> #如果单纯复制文件,docker推荐使用COPY
WORKDIR /root
VOLUME ["/data-:volume"] #表示容器启动的数据存储在宿主机的/data-volume下
#当一个镜像被其他镜像作为基础镜像时需要写上OBNBUILD,会在构建时插入触发器指令。
ENV <key><value> ENV <key>=<value>
USER nginx USER user:group
mkdir /root/dockerfile/nginx -p cd /root/dockerfile/nginx 上传包 nginx-1.14.2.tar.gz 至 /root/dockerfile/nginx vim dockerfile FROM centos:7.9.2009 MAINTAINER tom RUN yum install -y pcre* openssl* gcc c++ make ADD nginx-1.14.2.tar.gz /root RUN cd /root/nginx-1.14.2 && ./configure --prefix=/usr/local/nginx --sbin-path=/usr/local/nginx/sbin/nginx --conf-path=/usr/local/nginx/conf/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx/nginx.pid --lock-path=/var/lock/nginx.lock --user=nginx --group=nginx --with-http_ssl_module --with-http_stub_status_module --with-http_gzip_static_module --http-client-body-temp-path=/var/tmp/nginx/client/ --http-proxy-temp-path=/var/tmp/nginx/proxy/ --http-fastcgi-temp-path=/var/tmp/nginx/fcgi/ --http-uwsgi-temp-path=/var/tmp/nginx/uwsgi --http-scgi-temp-path=/var/tmp/nginx/scgi --with-pcre && make && make install RUN useradd nginx -s /sbin/nologin RUN mkdir /var/tmp/nginx/ RUN rm -rf /root/nginx-1.14.2 CMD /usr/local/nginx/sbin/nginx EXPOSE 80 443 #构建 docker build -t="images-name" 如:docker build -t="harbor/library/nginx:1.14.2"
vim dockerfile FROM MAINTAINER RUN ADD RUN RUN CMD EXPOSE
从基础镜像运行一个容器 执行一条指令,对容器做出修改 执行类似docker commit 的操作,提交一个新的镜像层 再基于刚提交的镜像运行一个新的容器 执行dockerfile中的下一条指令,直至所有指令执行完毕
据卷是存在于一个或多个容器中的特定文件或文件夹,这个文件或文件夹以独立于 docker 文件系统的形式存在于宿主机中。
数据卷特点
mkdir data-volume docker run -v ~/data-volume:/data -itd --name="nginx-v2" -p80:10080 192.167.0.58/library/nginx:1.14.2 /bin/bash #添加只读权限,即在容器里只读,在宿主机可更改文件内容 docker run -v ~/data-volume:/data:ro -itd --name="nginx-v2" -p80:10080 192.167.0.58/library/nginx:1.14.2 /bin/bash
VOLUME ["/data-volume1"] #查询 docker inspect 356a149ac70f "Mounts": [ { "Type": "volume", "Name": "9d65cec3de57c12ff6aad08cd5a08329c15529d98770703ec92856e3cf4f3163", "Source": "/var/lib/docker/volumes/9d65cec3de57c12ff6aad08cd5a08329c15529d98770703ec92856e3cf4f3163/_data", "Destination": "/data-volume1", "Driver": "local", "Mode": "", "RW": true, "Propagation": "" } ] #"Source" 即是宿主机文件的位置
docker run --name="nginx-vol-v2" --volumes-from nginx-vol-v1 -itd nginx-vol:latest /bin/bash #--volumes-from 后更要共享的容器即可共享。 #如: --volumes-from nginx-vol-v1 即和已运行的容器nginx-vol-v1共享数据
docker run --volumes-from nginx-vol-v1 -v /root/backup:/backup --name="datavolume-copy" nginx:1.14.2 tar -zvcf /backup/data-volume1.tar.gz /data-volume1 #原理:启动一个非交互的容器,共享需要备份数据的容器,然后将本地目录映射到非交互容器下,同时执行命令备份文件
docker run --volumes-from nginx-vol-v1 -v /root/backup/:/backup nginx:1.14.2 tar -xvzf /backup/data-volume1.tar.gz -C / #原理同备份
briage
默认Docker引擎启动会在本地生成一个Docker0虚拟网卡。Docker0是一个标准Linux虚拟网桥设备。在Docker默认的桥接网络工作模式中,docker0网桥起到了至关重要的作用。物理网桥是标准的二层网络设备,标准物理网桥只有两个网口,可以将两个物理网络连接在一起。效果如下图
hosts
通常来讲,启动新的Docker容器,都会分配独立的Network Namespace隔离子系统,如果在运行是指定为host模式,那么Docker容器将不会获得一个独立的Network Namespace,而是和宿主机共用一个Network Namespace子系统。新创建的Docker容器不会创建自己的网卡,不会再虚拟出自己的网卡、IP、网关、路由等信息,而是和宿主机共享IP和端口等信息,其他的软件、目录还是相互独立的。两个容器除了网络方面相同之外,其他的如文件系统、进程列表等还是相互隔离的。
none
None模式与其他的模式都不同,如果Docker容器使用None模式,Docker容器会拥有自己的Network Namespace子系统,但是Docker引擎并不会为新启动的Docker容器配置任何的网络信息。即新创建的Docker容器不会虚拟出自己的网卡、IP、网关、路由等信息,而是需要手工为Docker容器添加网卡、配置IP、路由等信息,在企业实战环境中,通常会使用Pipework工具为Docker容器指定IP等信息。
container
Docker容器网络,Container模式是指定新创建的容器和已存在的某个容器共享一个Network Namespace子系统,而不是和宿主机共享Namespace子系统。新创建的Docker容器不会创建自己的网卡,不会再虚拟出自己的网卡、IP、网关、路由等信息,而是和指定的Docker容器共享IP和端口等信息,其他的软件、目录还是相互独立的。两个容器除了网络方面相同之外,其他的如文件系统、进程列表等还是相互隔离的。如果依附的Docker容器关闭,新的Docker容器网络也会丢失。
vim /etc/sysconfig/docker other_args="-icc=false" #重启docker容器配置生效