Docker 组件:
1.Docker客户端和服务器
2.Docker镜像
3.Registry
4.Docker容器
1.内核(确认是否安装了3.8或更高的内核版本)
uname -r
2.检查Device Mapper
ls -l /sys/class/misc/device-mapper
如果没有,则yum -y install device-mapper
modprobe dm_mod
3.安装Docker
subscription-manager repos --enable=rhel-7-server-extras-rpms
yum install -y docker
4.启动Docker守护进程
systemctl start docker
systemctl enable docker
5.查看是否安装成功
docker info(返回所有容器和镜像的数量,docker使用的执行驱动和存储驱动,以及Docker的基本配置)
容器的创建和管理:创建、管理到停止,直到最终删除。
1.创建容器
docker run -i -t centos /bin/bash
-i:容器中STDIN是开启
-t:分配一个伪tty终端
基于centos创建容器并启动/bin/bash
首先Docker会检查本地是否存在centos镜像,不存在,则Docker就会连接官方维护的Docker Hub Registery,查看Docker Hub中是否有该镜像,Docker一旦找到该镜像,就会下载该镜像并保存到本地。
2.使用容器
输入exit,容器会停止运行,
3.查看存在的容器
docker ps -a
-a:列出所有容器
-q:仅返回容器的ID
4.重新启动已经停止的容器(start,restart)
Docker start container_name
Docker start container_ID
5.附着到容器上(attach)
Docker attach container_name
Docker attach container_ID
6.创建守护式容器
docker run --name daemon_bearlu -d centos /bin/sh -c "while true;do echo hello world;sleep 1;done"
-d:守护进程
7.查看容器的日志
docker logs container_name
docker logs --tail 10 container_name
-f:
-t:加上时间戳
8.查看容器内的进程
docker top container_name
9.在容器内部运行进程
后台任务:docker exec -d container_name COMMAND
交互式任务:docker exec -t -i container_name /bin/bash
10.停止守护进程
docker stop container_name
11.自动重启容器
docker run --restart=always --name bearlu -d centos /bin/sh “while ture; do echo hello world;sleep 1;done”
--restart=on-failure:5:只有当容器的退出代码非0值得时候,才会自动重启,重启次数为5
12.深入容器
docker inspect container_name
--format ‘{{.Name}}{{.State.Running}}’
13.删除容器
Docker rm container_name
先stop或者kill
-f:强制删除
镜像
Docker镜像是由文件系统叠加而成,最底端是一个引导文件系统,即bootfs,
第二层是root文件系统rootfs
当Docker第一次启动一个容器时,初始的读写层是空的。当文件系统发生变化时,这些变化都会应用到这一层上。采用写时复制(copy on write)。如果想修改一个文件,这个文件首先会从该读写层下面的只读层复制到该读写层。该文件的只读版本依旧存在,但是已经被读写层中的该文件副本所隐藏。
1.列出镜像
docker images
本地镜像:/var/lib/docker/containers/
2.拉取镜像
docker pull image_name
docker pull jdeathe/centos-ssh
tag centos:tag(是否同一个镜像,看ID号是否相同)
3.查找镜像
docker search image_name
4.构建镜像
docker commit命令
docker build命令和dockerfile文件
5.删除镜像(本地)
docker rmi image_name
hub.docker.com
账号:bearlu
密码:xxxxx
docker login
个人信息保存至~/.dockercfg文件中
1.docker commit方式:
docker commit container_ID bearlu/httpd:webserver
-m=”A new custom image”
--author=”BearLu”
bearlu/httpd 指的是镜像的用户名和仓库名,并加了一个webserver标签。
2.Dockerfile的定义文件和docker build 命令来构建镜像
mkdir static_web
cd static_web
touch Dockerfile
vim Dockerfile
FROM centos:latest
MAINTAINER bearlu
RUN yum -y install wget
RUN wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
RUN yum clean all && yum makecache
RUN yum -y install nginx
RUN echo 'Hello nginx' > /usr/share/nginx/html/index.html
EXPOSE 80
docker build -t="bearlu/static_web" .
查看镜像构造过程:
Docker history image_ID
从新镜像启动容器:
Docker run -d -p 80 --name static_web bearlu/static_web nginx -g “daemon off;”
-p:Docker运行时公开哪些端口号给宿主机。
-p 80:将Docker的80端口号映射到宿主机的任意端口号
-p 8080:80:将容器中的80端口绑定到宿主机的8080端口号上。
-p 127.0.0.1:8080:80:将容器内的80端口绑定到本地宿主机的127.0.0.1的80端口
-P:用来对开公开在Dockerfile中的EXPOSE指令中设置的所有端口号。
docker ps -l
curl localhost:32769
3.Dockerfile指令
a) FROM
格式:FROM <image>或FROM <image>:<tag>
第一条指令必须为FROM指令,并且,如果在同一个Dockerfile中创建多个镜像时,可以使用多个FROM指令,每个镜像一个
b) MAINTAINER
格式:MAINTAINER <name>,指定维护者信息
c) RUN
格式:RUN <command>或RUN [“executable”,”param1”,”param2”]
前者将在shell终端中运行命令,即/bin/sh -c;后者则使用exec执行,指定使用其他终端RUN [“/bin/bash” ,”-c”,”echo hello”]
每条RUN指令将在当前镜像基础上执行指定命令,并提交为新的镜像。使用(\)来换行。
d) CMD
CMD [“executable”,”param1”,”param2”]
CMD command param1 param2 在/bin/sh中执行,提供给需要交互的应用。
CMD [”param1”,”param2”]提供给ENTERYPOINT的默认参数
指定启动容器时执行的命令,每个Dockerfile只能有一条CMD命令。如果指定了多条命令,只有最后一条会被执行,如果用户启动容器时候指定了运行的命令,则会覆盖掉CMD指定的命令。
e) EXPOSE
格式:EXPOSE <port> [<port>...]
告诉Docker服务端容器暴露的端口号,共互联系统的使用。在启动容器时需要通过-P,Docker主机会自动分配一个端口转发到指定的端口。
f) ENV
格式:ENV <key> <value>
指定一个环境变量,会被后续RUN指令使用,并在容器运行时保持
g) ADD
格式:ADD <src> <dest>
将赋值指定的<src>到容器中的<dest>。其中<src>可以是Dockerfile所在目录的一个相对路径(文件或目录);也可以是一个URL;还可以是一个tar文件(自动解压为目录)
h) COPY
格式:COPY <src> <dest>
复制本地主机的<src>(为Dockerfile所在目录的相对路径,文件或目录)为容器中的<dest>.目标路径不存在时,会自动创建
当使用本地目录为源目录时,推荐使用COPY
i) ENTRYPOINT
格式:ENTRYPOINT [“executable”,”param1”,”param2”]
ENTRYPOINT command,param1,param2(shell中执行)
配置容器启动后执行的命令,并且不可被docker run提供的参数覆盖
每个Dockerfile中只能有一个ENTRYPIONT。如果指定了多条ENTRYPOINT,只有最后一条会被执行。
j) VOLUME
格式:VOLUME [“/data”]
创建一个可以从本地主机或其他容器挂载的挂载点,一般用来存放数据库或需要保持的数据
k) USER
格式:USER daemon
指定运行容器时的用户名或UID,后续的RUN也使用指定用户
当服务不需要管理员权限时,可以通过该命令指定运行用户。临时获取管理员权限可以使用gosu。而不推荐使用sudo。
l) WORKDIR
格式:WORKDIR /path/to/workdir
为后续的RUN,CMD,ENTRYPOINT指令配置工作目录。
可以使用多个WORKDIR指令,后续命令如果参数是相对路径,则会基于之前命令指定的路径。
m) ONBUILD
格式:ONBUILD [INSTRUCTION]
配置当所创建的镜像作为其他新创建镜像的基础镜像时,所执行的操作指令。
ONBUILD ADD . /app/src
ONBUILD RUN /usr/local/bin/python-build --dir /app/src
新dockerfile:
FROM image-A,会自动执行ONBUILD指令内容,等价于在后面添加了两条指令。
将镜像推送到Docker Hub
docker push bear/static_web
自动构建
把Dockerfile文件的仓库连接到Docker Hub即可。
创建本地的Registry
从容器运行Registry
docker run -p 5000:5000 registry
启动一个运行Registry应用的容器。
给镜像打标签:
docker tag image_id docker.example.com:5000/bearlu/static_web
docker.example.com:Register主机名
把镜像推送的新的Registry中
docker push docker.example.com:5000/bearlu/static_web
docker run -t -i docker.example.com:5000/bearlu/static_web
一个示例:
mkdir sample && cd sample
touch Dockerfile
mkdir nginx && cd nginx
wget https://raw.githubusercontent.com/jamtur01/dockerbook-code/master/code/5/sample
/nginx/global.conf
wget https://raw.githubusercontent.com/jamtur01/dockerbook-code/master/code/5/sample
/nginx/nginx.conf
vim nginx.conf
worker_processes 4;
pid /run/nginx.pid;
daemon off;
events { }
http {
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
include /etc/nginx/mime.types;
default_type application/octet-stream;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
gzip on;
gzip_disable "msie6";
include /etc/nginx/conf.d/*.conf;
}
cd ..
vim Dockerfile
FROM centos:latest
MAINTAINER Bearlu
ENV REFRESHED_AT 2016-03-22
RUN yum -y install wget
RUN wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
RUN yum clean all && yum makecache
RUN yum -y install nginx
RUN mkdir -p /var/www/html
ADD nginx/global.conf /etc/nginx/conf.d/
ADD nginx/nginx.conf /etc/nginx/nginx.conf
EXPOSE 80
docker build -t bearlu/nginx .
mkdir website
cd website
wget https://raw.githubusercontent.com/jamtur01/dockerbook-code/master/code/5/sample/website/index.html
cd ..
docker run -d -p 80 --name website -v $PWD/website:/var/www/html/website bearlu/nginx nginx
docker ps -l
curl http://localhost:32771