第一本Docker书读书笔记
日常使用命令
1.停止所有的container,这样才能够删除其中的images:
docker stop $(docker ps -a -q)
如果想要删除所有container的话再加一个指令:
docker rm $(docker ps -a -q)
2.查看当前有些什么images
docker images
3.删除images,通过image的id来指定删除谁
docker rmi <image id>
想要删除untagged images,也就是那些id为<None>的image的话可以用
docker rmi $(docker images | grep "^<none>" | awk "{print $3}")
要删除全部image的话
docker rmi $(docker images -q)
4进入已停止的容器
sudo docker start 容器id
sudo docker exec -i -t 容器id /bin/bash
5. 重命名镜像名
docker tag 镜像id 重命名:tag
6. 重命名容器名
dokcer rename 容器ID mytomcat7:jre7
正文
1)使用第一个交互式容器
sudo docker run -i -t ubuntu /bin/bash
-i 保证容器中STDIN是开启的,保证持久的标准输入
-t 为创建的容器分配一个伪tty终端
综上容器通过-it 提供了一个交互式的shell
1.首先Docker会检查本地是否存在ubuntu镜像,如果没有,docker会连接官方维护的docker hub registry查看hub并下载该镜像
2.随后使用该镜像再内部创建一个交互式的容器
3.登录到该容器中之后,会显示
user@容器id:/#
容器id名就是容器主机名
2)给容器命名
如果不给docker创建的容器指定名称,docker会为其随机指定一个名称
如果要指定特定的名称,使用--name标志来实现
sudo docker run --name spec_name -i -t ubuntu /bin/bash
3)重新启动已经停止的容器
sudo docker start spec_name
也可以通过容器id启动已经停止运行的容器
4)使用守护式容器
sudo docker run --name daemonizer_container -d ubuntu /bin/bash -c "while true; do echo hello world; sleep 1; done"
-d 参数 使得容器会在后台运行
5)查看容器内的进程
要查看容器内的进程,使用docker top命令
sudo docker top daemonizer_container
6)docker 统计信息
利用stats命令,显示一个或者多个容器的统计信息
sudo docker stats daemonizer_container (或后跟空格其他容器)
7) 在容器内部运行进程
利用docker exec命令在容器内部额外启动新进程
容器内运行的进程有两种类型
1.后台任务
2.交互式任务
sudo docker exec -d daemonizer_container touch /etc/new_file
-d标志需要运行一个后台进程,-d标志之后,指定的是在内部执行这个命令的容器名字和要执行的命令
sudo docker exec -i -t daemonizer_container /bin/bash
这里和运行交互式容器一样,在容器内创建一个新的bash会话
8)停止守护式容器
sudo docker stop daemonizer_container
或者通过容器id来停止
sudo docker stop casa123ca23
如果想要查看已经停止的容器
使用
docker ps -a
只查看正在运行的容器
docker ps
9)自动重启容器
由于某种错误而导致容器停止运行,可以通过--restart=always标志,让docker自动重新启动该容器
sudo docker run --restart=always --name daemonizer_container -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done;
10)查看容器具体信息
通过docker inspect 来获取更多的容器信息
sudo docker inspect daemonizer_container
11)删除容器
如果容器已经不再使用,可以使用docker rm命令来删除 (删除前必须保证容器已经停止运行)
删除指定的容器
sudo docker rm 容器id
删除所有容器(注意这里是`(1的左边) 而不是')
sudo docker rm `sudo docker ps -a -q`
-a 表示列出所有容器
-q 只返回容器的id
`sudo docker ps -a -q` 返回容器id的列表
12)创建一个自定义命名的最基本的容器
sudo docker run -i -t --name container_spec_name ubuntu /bin/bash

13)列出镜像
sudo docker images
如果只查看ubuntu相关镜像
sudo docker images ubuntu
本地的镜像都保存在docker宿主机的/var/lib/docker目录下
可以手动目录查看
也可以用
docker info
查看

14)从Docker hub查找可用镜像
sudo docker search 用户名/仓库名
15)从Docker hub上面拉取镜像
sudo docker pull 仓库
例子
sudo docker pull ubuntu #未指定标签,默认latest标签 或者指定带标签的镜像
sudo docker pull 仓库:tag
例子
sudo docker pull ubuntu:16.04
16)从指定镜像创建容器
sudo docker run -i -t 用户名/仓库名 /bin/bash
容器启动命令:docker run --name 参数1 -p 参数2 -v 宿主机与容器交互的目录文件 -d 后台运行
docker run --name tomcat -p : -v /usr/test:/usr/local/tomcat/webapps/test -d tomcat
参数解释:
--name tomcat 表示上一步安装的镜像名称
-p 8080:8080 表示将容器的8080port映射到本机的8080port端口
-v /usr/test:/usr/local/tomcat/webapps/test 表示将本机下的usr目录下的test文件夹映射到容器tomcat的webapps文件夹下
-d tomcat 表示在后台守护进程的方式启动(不进入后台启动),指定上一步安装的镜像名称
17)构建镜像方法
构建镜像有两种方法
- docker commit #不推荐使用
- Dockerfile-->docker build #推荐
其中Dockerfile支持DSL语法, 由指令和参数组成,支持注释
18)登录Docker hub
sudo docker login
登出
sudo docker logout
19)用Dockerfile构建镜像
mkdir DOCKER
cd DOCKER
touch Dockerfile
编辑Dockerfile
FROM ubuntu:14.04
MAINTAINER jojo "12301@qq.com"
RUN apt-get update && apt-get install -y python
RUN echo "hello,docker"
EXPOSE
每一条指令都会创建一个新的镜像层并对镜像进行提交
20)基于Dockerfile执行docker build构建新镜像
cd DOCKER
跳到Dockerfile目录
sudo docker build -t="jojo/docker_test" .
注意 别忘记 .代表使用当前目录的Dockerfile进行构建
也可以指定具体的Dockerfile位置,使用-f标志
docker build -t="用户名/仓库名" -f path/to/file
21)如果构建中失败
由于docker构建新镜像是分层进行的,即Dockerfile每一次构建过程都会将结果提交为镜像,所以在某step失败后,可根据最近的step容器id(屏幕输出build过程)
调试哪里错了
修改Dockerfile
继续build
sudo docker run -t -i 最近build的容器id /bin/bash
22)docker build 默认利用之前成功构建的镜像层当作缓存,如果要重头构建镜像,确保构建过程不使用缓存可以使用--no-cache标志
sudo docker build --no-cache -t="jojo/docker_test" .
23)查看镜像构建层或者构建历史
使用docker history
sudo docker history 镜像id
查看新构建的xx镜像的每一层以及每一层的Dockerfile指令
24)使用-p选项映射 容器特定的端口到本地的宿主机端口
docker可以通过两种方法在宿主机分配端口
- 随机选择32768~61000较大的端口来映射到容器指定的端口上
- 指定具体端口号进行映射
sudo docker run -d -p 127.0.0.1:: --name container_name jojo/docker_test
上面的命令会将容器的80端口绑定到本地宿主机的127.0.0.1这个ip的8080端口上
但这会限制Docker的灵活性,因此docker 还提供了一个更简单的方式,即-p参数,该参数可以用来对外公开在Dockerfile中通过EXPOSE指令公开的所有端口
25)查看宿主机与容器的映射关系
docker ps -l #可以查看端口映射
也可以通过docker port 查看
sudo docker port 容器id 或 容器名
或者
sudo docker port 镜像id 端口号(如80)
26)Dockerfile 指令
1.CMD
用于指定一个容器启动时要运行的命令.类似RUN指令是镜像被构建时要运行的命令,而CMD是指定容器被启动时要运行的命令
sudo docker run -t -i 用户名/仓库名 /bin/bash
相当于
sudo docker run -t -i 用户名/仓库名
+
CMD ["/bin/bash"]
2.WORKDIR
在容器内部设置一个工作目录,使得CMD指令会在这个目录下执行
WORKDIR /opt/webapp/db
RUN bundle install
WORKDIR /opt/webapp #最终工作目录设置为 /opt/webapp
CMD ["rackup"]
也可以通过-w标志在运行时覆盖工作目录
sudo docker run -t -i /var/log ubuntu pwd
该命令会将容器内的工作目录设置为/var/log
3.ENV
ENV指令用在镜像构建中设置环境变量
ENV RVM_PATH /home/rvm/
RVM_PATH即为一个环境变量
ENV TARGET_DIR /opt/app
WORKDIR $TARGET_DIR
也可以通过-e标志在运行时来传递环境变量
sudo docker run -t -i -e "WEB_PORT=8080" ubuntu env
这些环境变量也会被持久化保存到 我们的镜像创建的任何容器中
在容器终端中运行env命令
可以查看环境变量
4.VOLUME
VOLUME指令用来向基于镜像创建的容器添加卷
- 卷可以在容器间共享和重用
- 一个容器可以不是必须和其他容器共享卷
- 对卷的修改是立即生效的
- 对卷的修改不会对更新镜像产生影响
- 卷会一直存在直到没有任何容器再使用
5.ADD
ADD指令用来将构建环境下的文件和目录复制到镜像中
文件复制
ADD source_file target_file/to/path/source_file #构建目录下的source_file复制到镜像target_file/to/path/
目录复制
ADD source_file/to/path/ target_file/to/path/ #源文件目录位置 目的文件目录位置
指向源文件的位置参数可以试一个URL,或者构建上下文或者环境文件名或者目录
不能对构建目录或者上下文之外的文件进行ADD操作
使用URL作为文件源
ADD http://wordpress.org/latest.zip /root/wordpress.zip
另外如果将一个归档文件(gzio,bzip2,xz)制定为源文件,docker会自动将归档文件解开(unpack)
ADD latest.tar.gz /var/www/wordpress/
但docker不知道URL方式指定源位置中使用归档文件(书中所说,不确定现在是否更新)
6.COPY
COPY与ADD相似,不同的是COPY只关心在构建上下文中复制本地文件,而不会去做提取和解压工作,相当于缩水版ADD
同时COPY的复制路径必须是一个绝对路径,并且源路径必须以"/"结尾,这样docker会认为它是目录,如果目录不存在,docker会自动化递归的创建所需要的目录结构 相当于
mkdir -p #递归的创建目录
27)push 镜像到docker hub
这里按照书上步骤遇到了denied: requested access to the resource is denied问题
镜像构建完毕的时候 准备传入自己hub发现 被拒绝

报了denied: requested access to the resource is denied异常,意思是没有权限
解决的办法是:使用 docker tag改名字
docker tag REPOSITORY名字 dockerhub的"用户名/仓库名"
docker push "用户名/仓库名"

28)Docker镜像保存save、加载load
(1)查看要要保存的镜像的ID
docker images
(2)保存镜像
docker save 镜像名/镜像id -o /home/wzh/docker/spring-boot-docker.tar
(3)加载镜像
docker load -i spring-boot-docker.tar
解决方案 参考
https://stackoverflow.com/questions/41984399/denied-requested-access-to-the-resource-is-denied-docker
第一本Docker书读书笔记的更多相关文章
- 我的第一本docker书-阅读笔记
花了三四天看完了我的第一本docker书,话说书写的还是挺简单易懂的.与传统的VM,VirtualBox,或者与那种内核虚拟的xen,kvm相比,docker作为一种容器的虚拟方式,以启动进程的方式来 ...
- 第一本docker书 学习笔记(二)
#安装docker的先决条件 运行64位CPU构架的计算机(docker目前不支持32位的cpu) 运行LUFSinux3.8或者更高版本内核 内核必须支持一种合适的存储驱动,例如: device M ...
- 第一本docker书 学习笔记(一)
Docker的核心组件: Docker客户端和服务端 Docker镜像 Registry Docker容器 # Docker客户端和服务端 docker 是一个 C/S架构程序.客户端只需要向dock ...
- 《第一本docker书》—— 读后总结
关于docker 这本书其实并没有读完,只不过最近工作比较繁忙,也无心再看这些用不到的书.以后要是工作需要,再仔细学习吧. 这次的阅读算是达到目的了,对docker有了一定的了解.它的作用.意义以及大 ...
- 《第一本docker书》第4章 使用docker镜像和仓库 读书笔记
docker最底端是一个引导文件系统,即bootfs. 第二层是root文件系统rootfs,位于引导文件系统之上. 在传统的Linux引导过程中,root文件系统会最先以只读的方式加载,当引导结束并 ...
- 《第一本docker书》- 第一章笔记
环境: Ubuntu 14.04.2 LTS (GNU/Linux 3.16.0-30-generic i686) 第一章: 1 Docker客户端和服务器 2 Docker镜像 添加一个文件,执行一 ...
- 《第一本Docker书》学习笔记——第4章 使用Docker镜像和仓库
4.2 列出镜像 使用docker images命令: sudo docker images 本地镜像都保存在Docker宿主机的/var/lib/docker目录下. 也可以在/var/lib/do ...
- 《第一本Docker书》学习笔记——第3章 Docker入门
3.1 确保Docker已经就绪 查看docker是否正常工作: sudo docker info 3.2 运行我们的第一个容器 现在,让我们尝试启动第一个Docker容器.我们可以使用docker ...
- 第一本docker书,,持续更新中
1.查看应用是否在docker中部署成功 需要确认curl已安装 whereis curl sudo apt-get -y install curl curl localhost:8081 如果成 ...
随机推荐
- Kafka~HelloWorld得来不易
今天连搭了zookeeper和kafka的环境,并部署成功,但在.net驱动的操作下,没有消费成功,原因何在? 防火墙 zookeeper没运行? kafka没有公开IP? 第一感觉也就是这向个原因了 ...
- 前端笔记之JavaScript(四)关于函数、作用域、闭包那点事
一.自定义函数function 函数就是功能.方法的封装.函数能够帮我们封装一段程序代码,这一段代码会具备某一项功能,函数在执行时,封装的这一段代码都会执行一次,实现某种功能.而且,函数可以多次调用. ...
- Chapter 5 Blood Type——21
"Bella." Edward's voice was right beside me, relieved now. "Can you hear me?" “B ...
- Chapter 5 Blood Type——9
He grimaced. 他扮了一个鬼脸. "Or better," I continued, the pent-up annoyance flowing freely now, ...
- [六] 函数式接口的复合方法示例 predicate 谓词逻辑运算 Function接口 组合运算 比较器 逆序 比较链
复合的方法 有些函数式接口提供了允许复合的方法 也就是可以将Lambda表达式复合成为一个更加复杂的方法 之前的章节中有说到: 接口中的compose, andThen, and, or, negat ...
- 痞子衡嵌入式:通用NOR接口标准(CFI-JESD68)及SLC Parallel NOR简介
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是CFI标准及SLC Parallel NOR. NOR Flash是嵌入式世界里最常见的存储器,常常内嵌在微控制器里(Parallel型 ...
- 痞子衡嵌入式:ARM Cortex-M内核那些事(2)- 第一款微控制器
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是第一款Cortex-M微控制器. 1.天生荣耀:ARM Cortex-M处理器由来 ARM公司自2004年推出ARMv7内核架构时,摒弃 ...
- Java开发笔记(七十二)Java8新增的流式处理
通过前面几篇文章的学习,大家应能掌握几种容器类型的常见用法,对于简单的增删改和遍历操作,各容器实例都提供了相应的处理方法,对于实际开发中频繁使用的清单List,还能利用Arrays工具的asList方 ...
- es6 Moduel 默认名与非默认名
export default default 本质是将后面变量(值)赋给 default,然后以default名称输出. import 在获取default变量时,写在大括号的外面 ,可自定义名称. ...
- 少侠学代码系列(二)->JS实现
少侠:小子,休息好了没,赶紧的 帅气的我:好了好了,嚷什么 少侠:(拔刀)嗯? 帅气的我:少侠,淡定淡定,我们来看秘籍吧,刚刚我们说了JS实现是由三个部分组成的 核心(ECMAScript),文档对象 ...