之前提到过镜像和容器的关系就像面向对象思想中类和实例的关系,启动一个容器就好比实例化某个镜像
1.启动镜像 :docker run
命令:docker run [选项] 仓库名[:标签] [指令]
常用参数:
-a stdin: 指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项;
-d: 后台运行容器,并返回容器ID;
-i: 以交互模式运行容器,通常与 -t 同时使用;
-p: 端口映射,格式为:主机(宿主)端口:容器端口
-t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
--name="nginx-lb": 为容器指定一个名称;
以nginx为例:
拉取镜像:docker pull nginx # 如果是使用的官方镜像源并且拉取速度比较慢的话可以配置免费的加速器docker:配置 Docker 加速器-优快云博客
运行镜像:docker run --name webserver -d -p 80:80 nginx # 基于nginx在后台建立一个容器并命名为webserver、映射80端口,
运行结果:
[work@VM_0_3_centos docker_lianxi]$ docker run --name webserver -d -p 80:80 nginx
62018f2db2b391278e4427b6409861cdd19bc04c2015b4e66a8dc9ad3b235417
[work@VM_0_3_centos docker_lianxi]$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
62018f2db2b3 nginx "nginx -g 'daemon of…" 8 seconds ago Up 8 seconds 0.0.0.0:80->80/tcp webserver
此时我们在浏览器中输入http://localhost就可以看到Welcome to nginx!页面!(云服务器请浏览器访问服务器外网ip)
2.进入容器:docker exec
命令:docker exec [选项] 容器名/容器id 指令
参数:
-d :分离模式: 在后台运行
-i :即使没有附加也保持STDIN 打开
-t :分配一个伪终端
进入刚刚启动的webserver并进入交互模式:docker exec -it webserver bash
我们刚刚浏览器访问localhost时显示的页面就存在这个路径下面:/usr/share/nginx/html/
我们可以直接查看里面的内容:cat /usr/share/nginx/html/index.html
此时我们还不能直接用vi来修改文件我们需要给容器安装vim(容器是一个独立的系统)
1.更新源:apt-get update
2.安装vim:apt-get install -y vim
此时我们就可以使用VI来修改index.html文件来改变访问localhost时显示的内容了
如果不用vi我们也可以借助重定向符号'>'来对文件进行修改
如:echo "<h1>hello world</h1>" > /usr/share/nginx/html/index.html
此时我们浏览器访问localhost时就换变成hello world
3.退出容器 exit
命令:exit
4.查看容器内部的修改:docker diff
命令:docker diff [选项] 容器名/容器id
如我们要查看我们对webserver做了哪些修改
docker diff webserver
5.将当前容器制作成一个镜像: docker commit
命令:docker commit [选项] 容器名/容器id [仓库名[:标签]]
-a :提交的镜像作者
-c :使用Dockerfile指令来创建镜像
-m :提交时的说明文字
-p :在commit时,将容器暂停
如我们想将刚刚我们修改后的webserver保存为一个镜像,方便我们下次创建容器时直接是我们修改后的样子
docker commit -a "sgs921107" -m "修改了主页" webserver nginx:v1.1
6.查看镜像内部经过改动的历史记录:docker history
命令:docker history [选项] 仓库名:标签
-H :以可读的格式打印镜像大小和日期,默认为true
--no-trunc :显示完整的提交记录
-q :仅列出提交记录ID
如:docker history nginx:v1.1
7.列出所有启动的容器:docker ps
命令:docker ps [选项]
-a :显示所有的容器,包括未运行的
-f :根据条件过滤显示的内容
--format :指定返回值的模板文件
-l :显示最近创建的容器
-n :列出最近创建的n个容器
--no-trunc :不截断输出
-q :静默模式,只显示容器编号
-s :显示总的文件大小
8.停止正在运行的容器:docker stop
命令:docker [选项] 容器名1 [容器2、容器3...]
如停止之前运行的webserver: docker stop webserver
我们再想启动的时候就使用docker start webserver,重启:docker restart webserver
9.删除容器:docker rm
命令:docker rm [选项] 容器名/容器id [容器2、容器3...]
-f :通过SIGKILL信号强制删除一个运行中的容器
-l :移除容器间的网络连接,而非容器本身
-v :-v 删除与容器关联的卷
和删除镜像一样可以和查询配合使用
如:docker rm $(docker ps -a -q)
ps:
使用docker commit创建镜像时我们需要先基于镜像运行一个容器,然后进入容器修改后保存为一个新镜像(暂且这么理解),其实我们在进入容器修改容器内的文件实际是在容器的存储层记录我们的操作,当我们保存镜像的时候并不是把原镜像进行修改然后重新打包,这个过程是在原镜像的基础上又封装了一层,就是当我们用我们保存的镜像启动容器时会执行到原nginx镜像的执行结果然后执行我们修改的操作最终我们看到的是修改后的文件。
镜像并不是我们以为的是一个整体,它是有一层一层包起来的,其实每一层就可以视为一个小镜像,外层依赖于更里面的层。并且如果两个镜像的内层都拥有了同一个内层,这个内层在内存中是只存储一个的。比如上面讲的我们commit的nginx:v1.1,我们并不是在原nginx镜像上包了一层又存储一份,而是在内存中添加了一层,在我们使用我们保存的镜像nginx:v1.0的时候docker服务器就会执行原nginx的那些层然后执行我们最后保存的那一层