C类ip192.168.1.0划分24个子网;子网掩码计算:1、24=11000 2、二进制是5位,n=5 3、255.255.255.xxx,第四组前5位为1,即11111000=248
192.168.2.22/24 :/24表示子网掩码前24位都为1,及255.255.255.0
192.168.2.64/26: 子网掩码:255.255.255.192,主机个数=后6位为0,如果全都填为1,则111111=63,63-2=61个主机,要去掉保留的2个地址。。。
先删除容器再删除镜像,否则删除的仅仅是name和tag
docker rmi xxxx 删除镜像
安装
1、wget -qO- https://get.docker.com/ | sh
(yum -y install deltarpm ,,yum -y install applydeltarpm)
2、curl -sSL https://get.docker.com/ | sh
启动
service docker start
chkconfig docker on
验证
docker run hello-world
修改非root用户的组为docker
usermod -aG docker work
(将work追加到docker组中,-a|--append ##把用户追加到某些组中,仅与-G选项一起使用;-G|--groups ##把用户追加到某些组中,仅与-a选项一起使用)
安装docker-compose
curl -L https://github.com/docker/compose/releases/download/1.16.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
docker-compose --version
docker ps 查看运行的容器
docker exec -it d48b21a7e439 /bin/bash 进入容器
docker attach d48b21a7e439 进入容器
docker atrach —sig-proxy=false mynginx —sig-false确保ctrl-d、ctrl-c不会关闭容器
搜索docker镜像
docker search tutorial
下载镜像
docker pull learn/tutorial
运行docker
1、docker run learn/tutorial echo "hello world"
2、docker run -it -d --name="myruncontrainer" -h "hostname" -e ENVNAME="hello world" -P/-p 1234:6379 myredis:v3
Usage: docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
-d, --detach=false 指定容器运行于前台还是后台,默认为false
-i, --interactive=false 打开STDIN,用于控制台交互
-t, --tty=false 分配tty设备,该可以支持终端登录,默认为false
-u, --user="" 指定容器的用户
-a, --attach=[] 登录容器(必须是以docker run -d启动的容器)
-w, --workdir="" 指定容器的工作目录
-c, --cpu-shares=0 设置容器CPU权重,在CPU共享场景使用
-e, --env=[] 指定环境变量,容器中可以使用该环境变量
-m, --memory="" 指定容器的内存上限
-P, --publish-all=false 指定容器暴露的端口
-p, --publish=[] 指定容器暴露的端口
-h, --hostname="" 指定容器的主机名
-v, --volume=[] 给容器挂载存储卷,挂载到容器的某个目录
--volumes-from=[] 给容器挂载其他容器上的卷,挂载到容器的某个目录
--cap-add=[] 添加权限,权限清单详见:http://linux.die.net/man/7/capabilities
--cap-drop=[] 删除权限,权限清单详见:http://linux.die.net/man/7/capabilities
--cidfile="" 运行容器后,在指定文件中写入容器PID值,一种典型的监控系统用法
--cpuset="" 设置容器可以使用哪些CPU,此参数可以用来容器独占CPU
--device=[] 添加主机设备给容器,相当于设备直通
--dns=[] 指定容器的dns服务器
--dns-search=[] 指定容器的dns搜索域名,写入到容器的/etc/resolv.conf文件
--entrypoint="" 覆盖image的入口点
--env-file=[] 指定环境变量文件,文件格式为每行一个环境变量
--expose=[] 指定容器暴露的端口,即修改镜像的暴露端口
--link=[] 指定容器间的关联,使用其他容器的IP、env等信息
--lxc-conf=[] 指定容器的配置文件,只有在指定--exec-driver=lxc时使用
--name="" 指定容器名字,后续可以通过名字进行容器管理,links特性需要使用名字
--net="bridge" 容器网络设置:
bridge 使用docker daemon指定的网桥
host //容器使用主机的网络
container:NAME_or_ID >//使用其他容器的网路,共享IP和PORT等网络资源
none 容器使用自己的网络(类似--net=bridge),但是不进行配置
--privileged=false 指定容器是否为特权容器,特权容器拥有所有的capabilities
--restart="no" 指定容器停止后的重启策略:
no:容器退出时不重启
on-failure:容器故障退出(返回值非零)时重启
always:容器退出时总是重启
--rm=false 指定容器停止后自动删除容器(不支持以docker run -d启动的容器)
--sig-proxy=true 设置由代理接受并处理信号,但是SIGCHLD、SIGSTOP和SIGKILL不能被代理
docker容器&镜像
假设Linux内核是第0层,那么无论怎么运行Docker,它都是运行于内核层之上的。
这个Docker镜像,是一个只读的镜像,位于第1层,它不能被修改或不能保存状态。
一个Docker镜像可以构建于另一个Docker镜像之上,这种层叠关系可以是多层的。第1层的镜像层我们称之为基础镜像(Base Image),其他层的镜像(除了最顶层)我们称之为父层镜像(Parent Image)。这些镜像继承了他们的父层镜像的所有属性和设置,并在Dockerfile中添加了自己的配置。
Docker镜像通过镜像ID进行识别。
镜像ID是一个64字符的十六进制的字符串。
但是当我们运行镜像时,通常我们不会使用镜像ID来引用镜像,而是使用镜像名来引用。
---
创建容器会在所有的镜像层之上增加一个可写层。这个可写层有运行在CPU上的进程,而且有两个不同的状态:运行态(Running)和退出态(Exited)。
我们对它所做的一切变更都会永久地写到容器的文件系统中。要切记,对容器的变更是写入到容器的文件系统的,而不是写入到Docker镜像中的。
我们可以用同一个镜像启动多个Docker容器,这些容器启动后都是活动的,彼此还是相互隔离的。我们对其中一个容器所做的变更只会局限于那个容器本身。
如果对容器的底层镜像进行修改,那么当前正在运行的容器是不受影响的,不会发生自动更新现象。
如果想更新容器到其镜像的新版本,那么必须当心,确保我们是以正确的方式构建了数据结构,否则我们可能会导致损失容器中所有数据的后果。
64字符的十六进制的字符串来定义容器ID,它是容器的唯一标识符。容器之间的交互是依靠容器ID识别的,由于容器ID的字符太长,我们通常只需键入容器ID的前4个字符即可。
当然,我们还可以使用容器名,但显然用4字符的容器ID更为简便
docker容器使用
查看docker 单条指令的参数
docker run --help
查看端口映射
docker port 7a38a1ad55c6
用-p指定容器映射宿主机端口
docker run -d -p 5000:5000 training/webapp python app.py
查看容器内部的标准输出
1.docker logs [ID或者名字]
2.docker logs -f [ID]
查看容器中的所有进程
docker top [ID]
查看更详细的容器信息
docker inspect d11c00fbb89c(可以不用匹配全部ID,ID的前面部分信息就能匹配出相应的ID)
停止应用容器
docker stop 【ID、name】
启动应用容器
docker start 【ID、name】
docker restart【ID、name】
删除容器,删除前必须先停止容器
docker rm 【ID、name】
一次性删除全部容器
docker rm `docker ps -a -q` (-a 列出所有容器,-q只列出容器ID)
docker 镜像使用
列出本地主机的所有镜像
docker images
---
REPOSTITORY:表示镜像的仓库源
TAG:镜像的标签
IMAGE ID:镜像ID
CREATED:镜像创建时间
SIZE:镜像大小
统一仓库源有多个TAG,我们使用REPOSTITORY:TAG 来定义不同的镜像。
---
docker run -it ubuntu:14.04 /bin/bash
docker run -it ubuntu /bin/bash (默认使用ubuntu:latest镜像)
查找镜像
docker search httpd
---
NAME:镜像仓库源的名称
DESCRIPTION:镜像的描述
OFFICIAL:是否docker官方发布
更改镜像
1.从已经创建的容器中更新镜像,并且提交这个镜像
2.使用Dockerfile指令来创建一个新的镜像
---
先用已有的镜像创建一个容器
docker run -it ubuntu:15.10 /bin/bash
在运行的容器内更新操作
提交容器副本
docker commit -m="has update" -a="hll" e218edb10161 hll/ubuntu:v1
-m:提交的描述信息
-a:指定镜像作者
e218edb10161:要提交的容器ID
hll/ubuntu:v1:指定要创建的目标镜像名
使用新镜像来启动一个容器
docker run -it [hll/ubuntu:v1或者image id] [/bin/bash]
---
构建镜像
创建Dockerfile文件:
runoob@runoob:~$ cat Dockerfile
FROM centos:6.7
MAINTAINER Fisher "fisher@sudops.com"
RUN /bin/echo 'root:123456' |chpasswd
RUN useradd runoob
RUN /bin/echo 'runoob:123456' |chpasswd
RUN /bin/echo -e "LANG=\"en_US.UTF-8\"" >/etc/default/local
EXPOSE 22
EXPOSE 80
CMD /usr/sbin/sshd -D
---
每一个指令都会在镜像上创建一个新的层,每一个指令的前缀都必须是大写的。
第一条FROM,指定使用哪个镜像源
RUN 指令告诉docker 在镜像内执行命令,安装了什么。。。
然后,我们使用 Dockerfile 文件,通过 docker build 命令来构建一个镜像。
-------
docker build -t runoob/centos:6.7 .
-t :指定要创建的目标镜像名
. :Dockerfile 文件所在目录,可以指定Dockerfile 的绝对路径
----
----
设置镜像标签
docker tag 860c279d2fec runoob/centos:[newtag]
我们也可以使用 -p 标识来指定容器端口绑定到主机端口。
两种方式的区别是:
-P :是容器内部端口随机映射到主机的高端口。
-p : 是容器内部端口绑定到指定的主机端口。
docker run -d -P training/webapp python app.py
docker run -d -p 5000:5000 training/webapp python app.py
docker run -d -p 127.0.0.1:5001:5002 training/webapp python app.py
---
默认都是绑定 tcp 端口,如果要绑定 UDP 端口,可以在端口后面加上 /udp。
docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py
Docker容器连接
端口映射并不是唯一把 docker 连接到另一个容器的方法。
docker有一个连接系统允许将多个容器连接在一起,共享连接信息。
docker连接会创建一个父子关系,其中父容器可以看到子容器的信息。
容器命名
当我们创建一个容器的时候,docker会自动对它进行命名。另外,我们也可以使用--name标识来命名容器
docker run -d -P --name runoob training/webapp python app.py
FROM centos:latest
MAINTAINER HLL 'oneapm.com'
ENV REFRESHED_AT 2017-10-16
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
RUN yum -y update && yum -y install epel-release && yum -y install net-tools && yum -y install gcc && yum -y install make
RUN mkdir /etc/redis
RUN mkdir /data
COPY redis-3.2.9.tar.gz /data/
RUN cd /data && tar -zxvf /data/redis-3.2.9.tar.gz \
&& cd /data/redis-3.2.9 \
&& make && make PREFIX=/usr/local/redis install \
&& cp utils/redis_init_script /etc/rc.d/init.d/redis \
&& sed -i '/#!\/bin\/sh/a\#chkconfig: 2345 80 90' /etc/rc.d/init.d/redis \
&& sed -i 's/$EXEC $CONF/$EXEC $CONF \&/' /etc/rc.d/init.d/redis \
&& cp redis.conf /etc/redis/6379.conf \
&& sed -i 's/\/home\/ai\/redis\/log/data/' /etc/redis/6379.conf \
&& sed -i 's/daemonize yes/daemonize no/' /etc/redis/6379.conf \
&& sed -i 's/bind 127.0.0.1/#bind 127.0.0.1/' /etc/redis/6379.conf \
&& sed -i 's/protected-mode yes/protected-mode no/' /etc/redis/6379.conf \
&& chkconfig redis on
VOLUME /data
WORKDIR /data
ENTRYPOINT ["/bin/sh","-c"]
#ENTRYPOINT ["/usr/sbin/init"]
EXPOSE 6379
#CMD ["systemctl start redis"]
CMD ["/usr/local/redis/bin/redis-server /etc/redis/6379.conf"]
----
(protected-mode no,注释bind)
----
docker build -t myredis:v3
docker run -it -P -d myredis:v3
保存镜像到本地
docker save jasperxu/alpine:v3 > alpine.tar
导入本地文件到镜像
docker load < alpine.tar
上传镜像
docker login
docker push huanglinglin/myredis:v3
配置文件
/usr/lib/systemd/system/docker.service
/etc/default/docker
容器镜像存放路径
other_args="--graph=/docker"
网友评论