Docker学习笔记总结

时间:2022-09-02 00:13:22

Docker学习笔记

https://yeasy.gitbooks.io/docker_practice/content/

 

一 环境搭建

Ubuntu安装

.添加软件源的GPG密钥

curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -

.添加Docker软件源

sudo add-apt-repository \

    "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu \

    $(lsb_release -cs) \

stable"

.安装软件

sudo apt-get update

Sudo apt-get install docker-ce

Centos安装

.安装依赖包

sudo yum install -y yum-utils device-mapper-persistent-data lvm2

.添加软件源

sudo yum-config-manager \

    --add-repo \

https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

.安装docker CE

sudo yum makecache fast

sudo yum install docker-ce 

修改加速器服务

.vim /etc/default/docker

DOCKER_OPTS="--registry-mirror=https://jxus37ad.mirror.aliyuncs.com"

.sudo service docker restart 

二 镜像制作

镜像构成

  当我们运行一个容器的时候(如果不使用卷的话),我们做的任何文件修改都会被记录于容器存储层里。而 Docker 提供了一个 docker commit 命令,可以将容器的存储层保存下来成为镜像。换句话说,就是在原有镜像的基础上,再叠加上容器的存储层,并构成新的镜像。以后我们运行这个新镜像的时候,就会拥有原有容器最后的文件变化。

使用commit制作镜像

docker commit 的语法格式为:

docker commit [选项] <容器ID或容器名> [<仓库名>[:<标签>]]

docker run --name webserver -d -p : nginx

docker commit --author "tla001" --message "edit page" webserver nginx:v2 

  docker commit 命令除了学习之外,还有一些特殊的应用场合,比如被入侵后保存现场等。但是,不要使用 docker commit 定制镜像,定制行为应该使用 Dockerfile 来完成。造成镜像臃肿

使用Dockerfile定制镜像

  Dockerfile 是一个文本文件,其内包含了一条条的指令(Instruction),每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。

  除了选择现有镜像为基础镜像外,Docker 还存在一个特殊的镜像,名为 scratch。这个镜像是虚拟的概念,并不实际存在,它表示一个空白的镜像。如果你以 scratch 为基础镜像的话,意味着你不以任何镜像为基础,接下来所写的指令将作为镜像第一层开始存在。

指令详解

RUN

COPY 注意上下文目录

ADD 高级的复制,原路径可以是URL

CMD  exec 格式:CMD ["可执行文件", "参数1", "参数2"...]

  在指令格式上,一般推荐使用 exec 格式,这类格式在解析时会被解析为 JSON 数组,因此一定要使用双引号 ",而不要使用单引号

CMD [ "sh", "-c", "echo $HOME" ]

  容器中的应用都应该以前台执行,对于容器而言,其启动程序就是容器应用进程,容器就是为了主进程而存在的,主进程退出,容器就失去了存在的意义,从而退出,其他辅助进程不是它关系你的东西

ENTRYPOINT 入口点

ENV 设置环境变量 ENV <key1>=<value1> <key2>=<value2>...

  下列指令可以支持环境变量展开: ADD、COPY、ENV、EXPOSE、LABEL、USER、WORKDIR、VOLUME、STOPSIGNAL、ONBUILD。 

ARG构建参数

ARG <参数名>[=<默认值>]

构建参数和 ENV 的效果一样,都是设置环境变量。所不同的是,ARG 所设置的构建环境的环境变量,在将来容器运行时是不会存在这些环境变量的

该默认值可以在构建命令 docker build 中用 --build-arg <参数名>=<值> 来覆盖

VOLUME 定义匿名卷

VOLUME ["<路径1>", "<路径2>"...]

  在 Dockerfile 中,我们可以事先指定某些目录挂载为匿名卷,这样在运行时如果用户不指定挂载,其应用也可以正常运行,不会向容器存储层写入大量数

EXPOSE 声明运行时容器提供服务的端口

   要将 EXPOSE 和在运行时使用 -p <宿主端口>:<容器端口> 区分开来。-p,是映射宿主端口和容器端口,换句话说,就是将容器的对应端口服务公开给外界访问,而 EXPOSE 仅仅是声明容器打算使用什么端口而已,并不会自动在宿主进行端口映射

WORKDIR 指定工作目录

USER指定当前用户  USER 指令和 WORKDIR 相似,都是改变环境状态并影响以后的层。WORKDIR 是改变工作目录,USER 则是改变之后层的执行 RUN, CMD 以及 ENTRYPOINT 这类命令的身份

其它制作镜像的方法

从 rootfs 压缩包导入

docker import [选项] <文件>|<URL>|- [<仓库名>[:<标签>]]

保存镜像

docker save alpine | gzip > alpine-latest.tar.gz

导入镜像

docker load -i alpine-latest.tar.gz

  如果我们结合这两个命令以及 ssh 甚至 pv 的话,利用 Linux 强大的管道,我们可以写一个命令完成从一个机器将镜像迁移到另一个机器,并且带进度条的功能:

  docker save <镜像名> | bzip2 | pv | ssh <用户名>@<主机名> 'cat | docker load'

三 操作容器

Docker pull

docker pull centos

Docker run

Docker run -ti centos bash

Docker images

虚悬镜像docker images -f dangling=true

Docker rmi 删除镜像

Docker logs id 查看日志

Docker stop id 删除容器

Docker attach 连接容器

Docker rm 删除容器

Docker search 搜索镜像

docker export 7691a814370e > ubuntu.tar 导出容器快照

cat ubuntu.tar | sudo docker import - test/ubuntu:v1. 导入容器快照

docker import http://example.com/exampleimage.tgz example/imagerepo 导入URL

Docker load与 Docker import的区别

用户既可以使用docker load来导入镜像存储文件到本地镜像库,也可以使用docker import来导入一个容器快照到本地镜像库。这两者的区别在于容器快照文件将丢失所有的历史记录和元数据信息(即仅仅保存容器当时的快照状态),而镜像存储文件将保存完整记录,体积也较大。此外,从容器快照文件导入时,可以重新指定标签等元数据信息

四 数据卷

数据卷是一个可供一个或多个容器使用的特殊目录,它绕过 UFS,可以提供很多有用的特性:

  • 数据卷可以在容器之间共享和重用
  • 对数据卷的修改会立马生效
  • 对数据卷的更新,不会影响镜像
  • 数据卷默认会一直存在,即使容器被删除

*注意:数据卷的使用,类似于 Linux 下对目录或文件进行 mount,镜像中的被指定为挂载点的目录中的文件会隐藏掉,能显示看的是挂载的数据卷。

添加数据卷

Docker run -v 

删除数据卷

Docker rm -v

查看数据卷

Docker inspect id

数据卷容器

就是一个正常的容器,专门用来提供数据卷供其他容器挂在的

sudo docker run -d -v /dbdata --name dbdata training/postgres echo Data-only container for postgres

sudo docker run -d --volumes-from dbdata --name db1 training/postgres

sudo docker run -d --volumes-from dbdata --name db2 training/postgres

数据库容器

docker run -d --name db training/postgres

创建新容器连接到db

docker run -d -P --name web --link db:db training/webapp python app.py

--link 参数的格式为 --link name:alias,其中 name 是要链接的容器的名称,alias 是这个连接的别名。

五 网络

-p hostport:dockerport 实现端口映射

Docker与宿主机同一网段的实现

sudo docker network create mynet --subnet 219.216.88.0/24 --gateway 219.216.88.254 -o parent eth0

sudo docker run -ti -d --name webserver --net mynet --ip 219.216.88.111 nginx:v3 bash

六 Dockfile实战

基于centos7搭建nginx镜像

1.准备工作

pull centos

mkdir mynginx

cd mynginx

下载nginx源码

http://nginx.org/download/nginx-1.12.1.tar.gz

下载pcre源码

ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.38.tar.gz

将源码拷贝到mynginx目录

2.创建Dockerfile

FROM centos

MAINTAINER tla001

WORKDIR /usr/local/src/

COPY pcre-8.38.tar.gz .

COPY nginx-1.12..tar.gz .

RUN useradd -s /sbin/nologin www  && yum install vim gcc gcc-c++ openssl openssl-devel net-tools -y

RUN tar zxf pcre-8.38.tar.gz   &&  cd pcre-8.38 && ./configure --prefix=/usr/local/pcre  && make && make install

RUN tar zxf nginx-1.12..tar.gz && cd nginx-1.12. && ./configure --prefix=/usr/local/nginx  \ 

--user=www  \

--group=www \

--with-http_ssl_module  \

--with-http_stub_status_module \ 

--with-file-aio  \

--with-http_dav_module \

--with-pcre=/usr/local/src/pcre-8.38 && make && make install && chown -R www. /usr/local/nginx

#COPY nginx.conf /usr/local/nginx/conf/nginx.conf

#ADD vhosts /usr/local/nginx/conf/vhosts

ADD run.sh /root/run.sh

RUN chmod  /root/run.sh

CMD ["/root/run.sh"]

EXPOSE  

3.编译

sudo docker build -t nginx:v4 .

4.运行

sudo docker network create mynet  --subnet 219.216.88.0/24 --gateway 219.216.88.1 -o parent=eth0

sudo docker run -ti -d --name webserver --net mynet --ip 219.216.88.111 nginx:v4

Docker学习笔记总结的更多相关文章

  1. Docker学习笔记 — 配置国内免费registry mirror

    Docker学习笔记 — 配置国内免费registry mirror Docker学习笔记 — 配置国内免费registry mirror

  2. docker学习笔记1 -- 安装和配置

    技术资料 docker中文官网:http://www.docker.org.cn/ 中文入门课程:http://www.docker.org.cn/book/docker.html docker学习笔 ...

  3. Docker学习笔记之一,搭建一个JAVA Tomcat运行环境

    Docker学习笔记之一,搭建一个JAVA Tomcat运行环境 前言 Docker旨在提供一种应用程序的自动化部署解决方案,在 Linux 系统上迅速创建一个容器(轻量级虚拟机)并部署和运行应用程序 ...

  4. docker~学习笔记索引

    回到占占推荐博客索引 使用docker也有段时间了,写了不少文章与总结,下面把它整理个目录出来,方便大家去学习与检索! docker~学习笔记索引 docker~linux下的部署和基本命令(2017 ...

  5. Docker学习笔记 - Docker容器内部署redis

    Docker学习笔记(2-4)Docker应用实验-redist server 和client的安装使用 一.获取redis容器(含客户端和服务端) 二.创建服务端容器 1.在终端A中运行redis- ...

  6. docker学习笔记(一)—— ubuntu16&period;04下安装docker

    docker学习笔记(一)—— ubuntu16.04下安装docker 原创 2018年03月01日 14:53:00 标签: docker / ubuntu 1682 本文开发环境为Ubuntu ...

  7. docker学习笔记二:常用命令

    docker学习笔记二:常用命令 查看docker常用命令 docker --help 返回结果如下: 其中常用的命令如下: 1.image相关操作 展示所有的image: 删除image: rmi ...

  8. docker学习笔记-1

    docker学习笔记一:安装 mac安装docker docker官方文档上有这么一段话: Because the Docker daemon uses Linux-specific kernel f ...

  9. Docker&colon;学习笔记&lpar;1&rpar;——基础概念

    Docker:学习笔记(1)——基础概念 Docker是什么 软件开发后,我们需要在测试电脑.客户电脑.服务器安装运行,用户计算机的环境各不相同,所以需要进行各自的环境配置,耗时耗力.为了解决这个问题 ...

随机推荐

  1. 胡说REST(REpresentational State Transfer)

    Roy T. Fielding的2000年在他的博士论文中提出REpresentational State Transfer这一软件架构风格,相比"表述性状态转移"等等类似的拗口的 ...

  2. swiper超出部分出现滚动条

    html代码 <div class="wrap swiper-container"> <div class="swiper-wrapper"& ...

  3. &period;NET的三种缓存&lpar;页面缓存,控件缓存,自定义缓存&rpar;

    BLL.Area bll = new BLL.Area(); protected void Page_Load(object sender, EventArgs e) { if (Cache[&quo ...

  4. SQLite入门与分析&lpar;六&rpar;---再谈SQLite的锁

    写在前面:SQLite*机制的实现需要底层文件系统的支持,不管是Linux,还是Windows,都提供了文件锁的机制,而这为SQLite提供了强大的支持.本节就来谈谈SQLite使用到的文件锁——主 ...

  5. 深入理解BFC和Margin Collapse

    深入理解BFC和Margin Collapse   BFC的理解与应用 首先我们来看看w3c规范对BFC的解释,其实对于这种概念的学习上,我们总是建议首先寻找官方的定义,因为原则上来说官方的才是最权威 ...

  6. python3使用smtplib发电子邮件

    smtplib模块smtp简单邮件传输协议client实现.对于多功能性,有时,当你要发送带附件的邮件或图片,使用email.mime加载内容. 码,如以下: import smtplib impor ...

  7. Mac MySQLdb模块安装,可算解决了

    转载:http://blog.csdn.net/janronehoo/article/details/25207825 短评:这篇文章感觉是比较全面解决Mac MySQLdb模块安装问题的文章了,特别 ...

  8. MyBatis从入门到放弃一:从SqlSession实现增删改查

    前言 开博客这是第一次写系列文章,从内心上讲是有点担心自己写不好,写不全,毕竟是作为java/mybatis学习的过程想把学习的路线和遇到的问题都总结下来,也让知识点在脑海里能形成一个体系. 开发环境 ...

  9. &lbrack;技术&rsqb; OIer的STL入门教程

    注: 本文主要摘取STL在OI中的常用技巧应用, 所以可能会重点说明容器部分和算法部分, 且不会讨论所有支持的函数/操作并主要讨论 C++11 前支持的特性. 如果需要详细完整的介绍请自行查阅标准文档 ...

  10. JS-使用工厂方法创建对象

    function createPerson(name,age,gender){ //创建新对象 var obj=new Object(); //向对象中添加属性 obj.name=name; obj. ...