1.Docker学习
1.容器操作:
1.查看dokcer信息或版本docker info
docker -v
2.获取docker所有命令
docker help
获取命令的参数
man docker-命令
eg:获取 docker run 命令的所有参数
man docker-run
3.基于docker镜像运行容器
docker run -i -t --name 容器名 image:tag 程序
-i 表示以交互方式运行容器
-t 表示告诉docker为要创建的容器分配一个ty伪终端
--name 指定创建的容器名,如果无此参数,docker将生成随机的容器名
eg: 运行最新版本ubuntu的bash/shell程序
docker run -i -t ubuntu /bin/bash
4.重启停止的容器
docker start [-i] 容器名|容器id
-i 表示以交互方式重启
附着到容器上
docker attach 容器名|容器id
停止运行的容器
docker stop 容器名|容器id
查看运行的容器
docker ps
查看所有容器
docker ps -a
5.后台启动容器 --- 创建守护式容器
docker run --name 容器名 -d 镜像名 程序
-d 参数表示 docker将会把容器放到后台运行,仅返回一个后台运行的容器id
eg:在基于ubuntu镜像创建的容器111中,运行程序,每秒输出一个 hello docker,直到容器停止
docker run --name 111 -d ubuntu /bin/sh -c "while true; do echo hello docker; sleep 1; done"
6.删除所有exited状态的容器
docker rm $(docker ps -q -f status=exited)
说明:
docker ps -a -f status=exited 查询所有状态是exited的容器
docker ps -q -f status=exited 查询所有状态是exited的容器的id
7.查看容器运行日志
docker logs 容器名 | 容器id 打印所有容器运行日志
docker logs -f 容器名 | 容器id 类似 tail -f 动态打印容器运行日志
docker logs --tail lines -f 容器名 | 容器id 类似 tail -f --lines 从最后lines行开始,动态打印容器运行日志
Ctrl + C 退出日志跟踪
8.容器内的进程
查看容器内的进程
docker top 容器名 | 容器id
在容器内部运行进程
docker exec -d 容器名 | 容器id 运行的进程
说明:
docker exec 可以在正在运行的容器中进行维护、监控及管理任务
eg1:
后台启动一个Tomcat容器
docker run -d --name tom1 tomcat
查看tom1容器内的进程
docker top tom1
在tom1容器中创建一个文件
docker exec -d tom1 touch /ect/test.tom1
eg2:
在tom1容器中启动一个打开shell的交互任务 --- 进入运行时容器的一种方式
docker exec -it tom1 /bin/bash
在tom1容器中创建一个文件夹
docker exec -d tom1 mkdir /tom1
9.自动重启容器
--restart标志,让docker自动重新启动容器, --restart标志会检查容器的退出代码,并以此决定是否要重启容器,Docker默认不会重启
docker run --restart=always --name test1 -d ubuntu /bin/sh -c "while true; do echo hello docker; sleep 1; done"
解析:
--restart=always 无论容器的退出代码是什么,Docker都还自动重启容器
--restart=on-failure:5 当容器退出代码为非0时,Docker会尝试自动重启容器,最多重启5次
10.深入容器
docker inspect 容器名 | 容器id 查看容器详细信息,对容器进行详细检查,返回其配置信息(名称、命令、网络配置等数据)
11.删除容器 --- 必须先停止容器(stop 或 kill)
docker rm 容器名 | 容器id
一次性删除所有容器
docker rm $(docker ps -a -q)
12.2个有用的docker容器操作命令:
1.删除所有已停止的容器
docker rm $(docker ps -q -f status=exited)
2.进入后台运行的容器
docker exec -it 容器名 /bin/bash
docker attach 容器名
2.镜像操作
1.镜像:文件系统的叠加,最底层是引导文件系统,建立在宿主机内核之上。
一个镜像可以放到另一个镜像的顶部,位于下面的镜像称为父镜像,以此类推,直到最底部的镜像称为基础镜像
当从一个镜像启动容器时,Docker会在该镜像的最顶层夹杂一个读写文件系统,运行的程序就在这个读写层中执行
当Docker第一次启动一个容器时,初始的读写层是空的,当文件系统发生变化时,这些变化都会应用到这一层上,
eg:
如果想修改一个文件,这个文件首先会从该读写层下面的只读层复制到该读写层,该文件的只读版本依然存在,但已经被读写层还总的该文件副本所隐藏
可写容器
|
Tomcat镜像
|
Ubuntu镜像
|
引导文件系统
|
宿主机内核
2.镜像仓库 docker官方
docker search 镜像 查询镜像
docker images 列出本地所有镜像
docker pull image:tag 拉取镜像,如果没有tag,默认拉取image镜像的最新版本 image:latest
3.构建镜像 Dockerfile文件 + docker build 命令
1.创建docker hub帐号
2.docker login 登录
3.通过Dockerfile创建镜像
eg:创建一个nginx的基础镜像
mkdir static_web
cd static_web
touch Dockerfile
编辑Dockerfile内容如下:
#Version: 0.0.1
FROM ubuntu:14.04
MAINTAINER Jay He jayhe@jayhe.com
RUN apt-get update
RUN apt-get install -y nginx
RUN echo 'Hi, I am in your container ' > /usr/shar/nginx/html/index.html
EXPOSE 80
4.基于Dockerfile文件创建镜像
docker build -t="author/image_name:tag" .
解析:
-t 为新镜像设置了仓库和名称:版本标签 , 如果没有指定tag,Docker默认设置为latest标签
. 最后的 . 告诉 Docker到本地目录中去找Dockerfile文件,
也可通过一个git仓库的地址来指定Dockerfile位置
eg:
docker build -t="jay/static_web:v1" git@github.com:xx/docker-static_web
5.从新镜像启动容器
docker run -d -p 80 --name static_web jay/static_web:v1 nginx -g "daemon off"
解析:
后台启动(适合nginx这样长时间运行的守护进程)一个名为static_web的容器,
同时指定了需要在容器中运行的命令:nginx -g "daemon off" (以前台运行方式启动Nginx,作为我们的Web服务器)
-p 随机指定一个宿主机port映射到容器中的80端口
-p port1:port 将容器的port端口,映射到宿主机的port1端口
6.Docker指令
Dockerfile结构:
FROM 基础镜像 第一条指令
MAINTAINER xx 作者信息
RUN xx RUN指令会在当前镜像中运行指定的命令,这里通过RUN指令安装nginx包,然后创建一个index.html文件
EXPOST port 指定对外的端口
CMD
指定一个容器启动时要运行的命令, 指令会被docker run 命令行 参数 覆盖
类似RUN指令,但:
RUN指令时指定镜像被构建时要运行的命令,
CMD 指定容器被启动时要运行的命令,类似 docker run 启动容器时,指定要运行的命令
eg:
docker run -it jay/static_web /bin/true
<==>
CMD ["bin/true"]
eg:为要运行的命令指定参数 --- 容器启动时,列出所有文件
CMD ["/bin/bash", "-l"]
注意:
1.docker run 命令 会覆盖 CMD指令
2.指定了多条CMD指令,只会执行最后一条
ENTRYPOINT
指定一个容器启动时要运行的命令, 指令不会被docker run 命令覆盖,
docker run 命令行中指定的参数都会被当作参数再次传递给 ENTRYPOINT指令中指定命令
-build 参数 命令 覆盖配置