docker入门
内容来源为六星教育,这里仅作为学习笔记
docker入门
什么是docker
Docker 是一个开源的应用容器引擎,你可以将其理解为一个轻量级的虚拟机 你 ,开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何 流行的 Linux 机器上。
为什么要使用 Docker?
作为一种新兴的虚拟化方式,Docker 跟传统的虚拟化方式相比具有众多的优势。
更高效的利用系统资源
由于容器不需要进行硬件虚拟以及运行完整操作系统等额外开销,Docker 对系统资源的利用率更高。
无论是应用执行速度、内存损耗或者文件存储速度,都要比传统虚拟机技术更高效。因此,相比虚拟机技术,一个相同配置的主机,往往可以运行更多数量的应 用。
更快速的启动时间
传统的虚拟机技术启动应用服务往往需要数分钟,而 Docker 容器应用,由于直接运行于宿主内核,无需启动完整的操作系统,因此可以做到秒级、甚至毫秒级的 启动时间。大大的节约了开发、测试、部署的时间。
一致的运行环境
开发过程中一个常见的问题是环境一致性问题。由于开发环境、测试环境、生产环境不一致,导致有些 bug 并未在开发过程中被发现。而 Docker
的镜像提供了 除内核外完整的运行时环境,确保了应用运行环境一致性,从而不会再出现 「这段代码在我机器上没问题啊」 这类问题。
持续交付和部署
对开发和运维(DevOps)人员来说,最希望的就是一次创建或配置,可以在任意地方正常运行。
使用 Docker 可以通过定制应用镜像来实现持续集成、持续交付、部署。开发人员可以通过 Dockerfile
来进行镜像构建,并结合持续集成(Continuous Integration) 系统进行集成测试,而运维人员则可以直接在生产环境中快速部署该镜像,甚至结合 持续部署(Continuous Delivery/Deployment) 系统进行自动部署。
而且使用 Dockerfile
使镜像构建透明化,不仅仅开发团队可以理解应用运行环境,也方便运维团队理解应用运行所需条件,帮助更好的生产环境中部署该镜像。
更轻松的迁移
由于 Docker 确保了执行环境的一致性,使得应用的迁移更加容易。Docker 可以在很多平台上运行,无论是物理机、虚拟机、公有云、私有云,甚至是笔记本,其 运行结果是一致的。因此用户可以很轻易的将在一个平台上运行的应用,迁移到另一个平台上,而不用担心运行环境的变化导致应用无法正常运行的情况。
更轻松的维护和扩展
Docker 使用的分层存储以及镜像的技术,使得应用重复部分的复用更为容易,也使得应用的维护更新更加简单,基于基础镜像进一步扩展镜像也变得非常简单。 此外,Docker 团队同各个开源项目团队一起维护了一大批高质量的 官方镜像,既可以直接在生产环境使用,又可以作为基础进一步定制,大大的降低了应用服务 的镜像制作成本。
可以理解为就是程序中的继承-》而镜像可以类似于composer组件
对比传统虚拟机总结
特性 | 容器 | 虚拟机 |
---|---|---|
启动 | 秒级 | 分钟级 |
硬盘使用 | 一般为mb | 一般为GB |
性能 | 接近原生 | 弱于 |
系统支持量 | 单机支持上千个容器 | 一般几十个 |
Docker 的主要用途,目前有三大类。
(1)提供一次性的环境。比如,本地测试他人的软件、持续集成的时候提供单元测试和构建的环境。
(2)提供弹性的云服务。因为 Docker 容器可以随开随关,很适合动态扩容和缩容。
(3)组建微服务架构。通过多个容器,一台机器可以跑多个服务,因此在本机就可以模拟出微服务架构。
扩容和缩容:对于我们的系统来说在项目运行过程中会存在这最高峰值,和最低峰值;整个项目运行过程中并不是一直是平稳的访问,对于这种时候如果说一次性就 部署N个机器但是实际上只有在某几个时候有高峰期其余时间没有就会显得比较浪费,这个时候如果说通过docker虚拟多个机器,然后通过多docker进行控制启动 与停止实现扩容和缩容
- 加速本地开发。通过Docker能够快速搭建好开发和运行环境,并且该环境可以直接传递
- 给测试和产品部署。
- 自动打包和部署应用。
- 创建轻量、私有的PaaS环境。
- 自动化测试和持续集成/部署。
- 部署并扩展Web应用、数据库和后端服务器。
- 创建安全沙盒。
centos安装docker
$ 1、更新update到最新的版本
~ yum update
$ 2、卸载老版本docker
~ yum remove docker docker-common docker-selinux docker-engine
$ 3、安装需要的软件包
~ yum install -y yum-utils device-mapper-persistent-data lvm2
$ 4、设置yum源
~ yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
$ 5、查看docker版本
~ yum list docker-ce --showduplicates|sort -r
$ 6、安装docker
~ yum install docker-ce-18.03.1.ce -y
$ 7、启动docker
~ systemctl start docker
$ 8、加入开机自启
~ systemctl enable docker
$ 9、配置国内镜像
~ vi /etc/docker/daemon.json
{
"registry-mirrors": ["https://cr.console.aliyun.com/"]
}
~ ps -aux | grep docker
安装redis6
在讲解docker使用之前首先我们先安装一下redis6,因为我们讲了docker是一个具有移植性很强的虚拟机容器;我们可以通过对比redis的安装就可以了解
~ wget https://github.com/antirez/redis/archive/6.0-rc2.tar.gz
~ tar -zxvf 6.0-rc2.tar.gz
~ cd redis-6.0-rc2/
~ /usr/local/bin/gcc -v
使用内建 specs。
COLLECT_GCC=/usr/local/bin/gcc
COLLECT_LTO_WRAPPER=/usr/local/libexec/gcc/x86_64-pc-linux-gnu/7.1.0/lto-wrapper
目标:x86_64-pc-linux-gnu
配置为:../configure --enable-checking=release --enable-languages=c,c++ --disable-multilib 线程模型:posix
gcc 版本 7.1.0 (GCC)
~ CC=/usr/local/bin/gcc make
~ make install
~ redis-server
注意过程中的问题:
- 时间问题:如果出现时间问题可通过如下操解决
~ date -s 04/15/2020
- 编译出现如下问题:gzip: stdin: invalid compressed data–format violated
原因:是windows下上传到服务器存在这不统一的编码问题:如ascii; 解决直接在服务器上wget - 如果make下的报错
如上的报错只需要编译的时候追加MALLOC=libc即可zmalloc.h:50:31: fatal error: jemalloc/jemalloc.h: No such file or directory #include <jemalloc/jemalloc.h> ^ compilation terminated. make[1]: *** [adlist.o] Error 1 make[1]: Leaving directory `/usr/local/redis-5.0.5/src' make: *** [all] Error 2
~ make MALLOC=libc
- Redis6安装是需要gcc5以上的版本
可参考这两篇文章安装gcc5:https://blog.csdn.net/qilimi1053620912/article/details/83862513 https://www.jianshu.com/p/f7cd0e2416b9 https://blog.csdn.net/qq_42609381/article/details/80915295
~ sudo yum install wget ~ wget http://ftp.tsukuba.wide.ad.jp/software/gcc/releases/gcc-7.1.0/gcc-7.1.0.tar.gz ~ tar -xvf gcc-7.1.0.tar.gz ~ cd gcc-7.1.0 --可能需要安装: ~ sudo yum -y install bzip2 -- 会很久 ~ ./contrib/download_prerequisites ~ mkdir build ~ cd build ~ ../configure --enable-checking=release --enable-languages=c,c++ --disable-multilib -- 会很久 ~ make && sudo make install ~ sudo ldconfig ~ gcc -v
- server.h:1022:5: 错误:expected specifier-qualifier-list before ‘_Atomic’ _Atomic unsigned int lruclock; /* Clock for LRU eviction */
参考文章:https://wanghenshui.github.io/2019/12/31/redis-ce
这个问题是在redis6.0编译的时候会经常出现,解决的办法只需要手动指定gcc进行编译安装;注意默认编译redis的时候是会选择gcc低于5的版本~ find / -name gcc /usr/local/bin/gcc ~ CC=/usr/local/bin/gcc make
docker基本概念
参照文章:https://www.cnblogs.com/whych/p/9446032.html
参考文章:https://juejin.im/post/5d57c1b5f265da03dc076ba6
参考文章:https://www.jianshu.com/p/0d7a89154211
Docker 包括三个基本概念:镜像,容器,仓库
这三部分组成了Docker的整个生命周期,如下图所示,容器是由镜像实例化而来的,这和我们学习的面向对象的概念十分相似,我们可以把镜像想象成类,把容器 想象成类经过实例化后的对象,这样就非常好理解镜像和容器的关系了。
镜像(Image)
Docker的镜像概念类似于虚拟机里的镜像,是一个只读的模板,-个独立的文件系统,包括运行 容器所需的数据,可以用来创建新的容器。
例如:一个镜像可以包含一个完整的ubuntu操作系统环境,里面仅安装了Mysql或用户需要的其 它应用程序。
Docker的镜像实际上由一层- -层的文件系统组成,这种层级的文件系统被称为 UnionFS。
镜像可以基于Dockerfile构建,Dockerfile是- -个描述文件,里面包含若干条命令,每条命令都会对基础文件系统创建新的层次结构。
Docker提供了-个很简单的机制来创建镜像或者更新现有的镜像,用户甚至可以直接从其他人那 里下载一个已经做好的镜像来直接使用。
容器(Container)
Docker利用容器来运行应用。
Docker容器是由Docker镜像创建的运行实例。Docker容器类似虚拟机, 可以支持的操作包括启动,停止,删除等。每个容器间是相互隔离的,容 器中会运行特定的应用,包含特定应用的代码及所需的依赖文件。
可以把容器看做是一-个简易版的Linux环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。
仓库(Repository)
如果你使用过git和github就很容易理解Docker的仓库概念。Docker 仓库的概念跟Git类似,注册服务器可以理解为GitHub这样的托管服务。
Docker仓库是用来包含镜像的位置,Docker提供一 个注册服务器(Register) 来保存多个仓库,每个仓库又可以包含多个具备不同tag的镜像。 Docker运行中使用的默认仓库是Docker Hub公共仓库。
仓库支持的操作类似git,当用户创建了自己的镜像之后就可以使用push命令将它上传到公有或者私有仓库,这样下次在另外一台机器上使用这个镜 像时候,只需要从仓库上pull下来就可以了。.
镜像结构
镜像的系统结构:
如上图展示了Docker镜像的系统结构。镜像的最底层必须是一个称为启 动文件系统( bootfs )的镜像,用户不会与这一层直接打交道。bootfs的上层镜像叫作根镜像 ( rootfs ),它在通常情况下是一个操作系统,如Ubuntu、 Debian 和CentOS等。用户的镜像必须构建于根镜像之上。图中所示的镜像1是通过在根镜像ubuntu上安装 MySQL来创建的。在镜像1的基础上再安装一个redis,就又创建了镜像2。利用镜像2启动的容器里面运行的是一个已 经安装好了MySQL和Nginx的 centos系统。
[root@localhost 01]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
REPOSITORY :仓库名称。仓库一般用来存放同一类型的镜像,其名称由它的创建者指定,如果创建时没有指定则为 。仓库的名称有下面几种形式。
- [namespace\centos] :由命名空间和实际的仓库名称组成,中间通过\ 隔开。当你在docker hub 上注册一个账户时, 账户名便自动成为了你 的命名空间, 该命名空间是用来区分Docker Hub 上注册的不同用户或者组织。如果你想创建一个分发到Docker Hub上去的镜像, 必须指定命名空间。如 果不指定或者指定了但命名空间不符合, 将会得到如下错误:
2014/12/1020:43 : 10 Error: Status 403 trying tO push repository abcd/abcd: “Access Denied :Not allowed tO
create Repo at given location”- [centos] :只有仓库名。对于这种没有命名空间的仓库名,我们可以认为它属于顶级命名空间。该空间的仓库只用于官方的镜像,由Docker官 方进行管理,但一般会授权给第三方进行开发维护。用户在本地创建的镜像也可以这样命名,但是无法分发到DockerHub上进行共享。
TAG: 用于区分同一仓库中的不同镜像。如果未指定,默认为latest。
IMAGE ID: 每个镜像都有一个字符串类型、长为64位的HashID, 用来全网标识一 个镜像。该字段只展示前面一部分,因为这一一部分已经足以在本机唯一标识- 一 个镜像了。
CREATED: 镜像的创建时间。
VIRTUAL SIZE: 镜像所占用的虚拟大小,该大小包含了所有共享文件的大小。
我们可以通过运行如下命令下载docker镜像
[root@localhost redis6]# docker docker run ubuntu echo "hello world docker"
docker: 'docker' is not a docker command.
See 'docker --help'
[root@localhost redis6]# docker run ubuntu echo "hello world docker"
Unable to find image 'ubuntu:latest' locally
latest: Pulling from library/ubuntu
5bed26d33875: Pull complete
f11b29a9c730: Pull complete
930bda195c84: Pull complete
78bf9a5ad49e: Pull complete
Digest: sha256:bec5a2727be7fff3d308193cfde3491f8fba1a2ba392b7546b43a051853a341d
Status: Downloaded newer image for ubuntu:latest
hello world docker
如上命令使用docker run命令运行一个镜像时,docker首先是会在本机寻找该镜像,如果本机不存在,会去docker Hub上面搜索符合条件的镜像并将其下载下来运 行
dockerhub : https://hub.docker.com
当然也可以通过pull命令来完成拉取镜像
[root@localhost redis6]# docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
123275d6e508: Pull complete
6cd6a943ce27: Pull complete
a50b5ac4a7fb: Pull complete
Digest: sha256:d81f010955749350ef31a119fb94b180fde8b2f157da351ff5667ae037968b28
Status: Downloaded newer image for nginx:latest
然后查看:
[root@localhost redis6]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest e791337790a6 4 days ago 127MB
ubuntu latest 4e5021d210f6 4 weeks ago 64.2MB
删除镜像
-- 指定删除
docker rmi 镜像id(image id)
-- 强制删除
docker rmi -f 镜像id(image id)
-- 删除所有容器
docker rmi $(docker images -q)
dockerfile介绍及构建镜像
利用docker快速安装一个redis镜像,了解dockerFile指令
Dockerfile 是一个文本文件,其内包含了一条条的指令(Instruction),每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。 具体的我们查看 给大家的pdf的书籍,命令都是简单的,我们会慢慢的去学习
这种方式是比较流行的方式。就是将需要对镜像的操作全部写到一个文件中,然后使用docker build命令从这个文件中创建镜像。这种方法可以使镜像的创建变得 透明化和独立化,并且创建过程可以被重复执行。dockerfile文件以行位单位,性首为dockerfile命令,命令都是大写形式,期后紧跟着的是命令的参数。
dockerfile指令
-
FROM 指定基础镜像
指定待扩展的父级镜像。除了注释外,在文件开头必须是一一个FROM指令, 接下来白指令便在这个父级镜像的环境中运行,直到遇到下一一个FROM指令。通过 添加多个FROM命令可以在同一个Dockerfile文件中创建多个镜像。所谓定制镜像,那一定是以一个镜像为基础,在其上进行定制。就像我们之前运行了一个redis镜像的容器,再进行修改一样,基础镜像是必须指定的。而 FROM 就是指定基础镜像,因此一个 Dockerfile 中 FROM 是必备的指令,并且必须是第一条指令。
在 Docker Store 上有非常多的高质量的官方镜像,有可以直接拿来使用的服务类的镜像,如nginx 、 redis 、 mongo 、 mysql 、 httpd 、 php 、 tomcat 等;如 果没有找到对应服务的镜像,官方镜像中还提供了一些更为基础的操作系统镜像,如ubuntu 、 debian 、 centos、 alpine 等这些操作系统的软件库
一般会以alpine为主,因为节约的资源比较少
-
RUN 执行命令
RUN 指令是用来执行命令行命令的。 格式: RUN \<command\> (类似/bin/sh -cshell格式) RUN ["executable", "param1", "param2"] (exec格式) 类似shell脚本风格的: FROM alpine RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories RUN apk add gcc g++ libc-dev wget vim openssl-dev make linux-headers RUN mkdir -p /usr/src/redis RUN cd /usr/src/redis RUN wget -O redis-4.0.11.tar.gz "http://download.redis.io/releases/redis-4.0.11.tar.gz" RUN tar -xzf redis-4.0.11.tar.gz -C /usr/src/redis RUN cd /usr/src/redis/redis-4.0.11 && make && make PREFIX=/usr/local/redis install
-
MAINTAINER
用来声明创建的镜像的作者信息。在上述代码中,xxh是用户名,xxh@qq.co .是邮箱。这个命令并不是必需的。 -
EXPOSE
用来指明容器内进程对外开放的端口,多个端口之间使用空替隔力。运行容器通过参数-p(大写)即可将EXPOSE里所指定的端口映射到主机上另外的随机端口,容器 或主机就可以通过映射后的端口与此容器通信。同时,我们也可以通过-p (小写)参数将dockerfile中EXPOSE中没有列出的端口设置成公开的。 -
ADD
向新镜像中添加文件,这个文件可以是一个主机文件,也可以是一个网络文件, 也可以是一个文件夹 -
ENV
设置容器运行的环境变量。在运行容器的时候,通过-e参数可以修改这个环境变量值,也可以添加新的环境变量:
注:Dockerfile 中每一个指令都会建立一层, RUN 也不例外。每一个 RUN 的行为,就和刚才我们手工建立镜像的过程一样:新建立一层,在其上执行这些命令, 执行结束后, commit这一层的修改,构成新的镜像。使用 Dockerfile 定制镜像而上面的这种写法,创建了很多层镜像。这是完全没有意义的,而且很多运行时不 需要的东西,都被装进了镜像里,比如编译环境、更新的软件包等等。结果就是产生非常臃肿、非常多层的镜像,不仅仅增加了构建部署的时间,也很容易出错。 这是很多初学Docker 的人常犯的一个错误。Union FS是有最大层数限制的,比如 AUFS,曾经是最大不得超过 42 层,现在是不得超过 127 层。
dockerfile构建redis镜像
创建一个Dockerfile的文件,注意没有后缀(文件名也可以不叫Dockerfile,但是docker默认找的就是这个文件,如果不是则需要指定)
我们通过如下命令构建redis6的镜像
FROM centos
RUN groupadd -r redis && useradd -r -g redis redis
RUN yum update -y && yum install epel-release -y
RUN yum install wget -y && yum -y install bzip2
RUN wget http://ftp.tsukuba.wide.ad.jp/software/gcc/releases/gcc-7.1.0/gcc-7.1.0.tar.gz
RUN mkdir -p /usr/src/gcc
RUN tar -xvf gcc-7.1.0.tar.gz -C /usr/src/gcc
RUN cd /usr/src/gcc/gcc-7.1.0 && ./contrib/download_prerequisites
RUN mkdir /usr/src/gcc/gcc-7.1.0/build
RUN cd /usr/src/gcc/gcc-7.1.0/build && ../configure --enable-checking=release --enable-languages=c,c++ --disable-multilib
RUN cd /usr/src/gcc/gcc-7.1.0/build && make && make install
RUN wget https://github.com/antirez/redis/archive/6.0-rc2.tar.gz
RUN mkdir -p /usr/src/redis
RUN tar -zxvf 6.0-rc2.tar.gz -C /usr/src/redis RUN cd /usr/src/redis/redis-6.0-rc2/ && CC=/usr/local/bin/gcc make && make install
然后执行如下命令构建
docker build -t redis6-test .
只是因为一些软件的关系构建比较慢这儿需要跳过改为构建redis5的镜像
FROM centos
RUN groupadd -r redis && useradd -r -g redis redis
RUN yum update -y && yum install epel-release -y
RUN yum install wget -y && yum -y install gcc automake autoconf libtool make
RUN yum install gcc gcc-c++ -y
RUN mkdir -p /usr/src/redis
RUN wget https://github.com/antirez/redis/archive/5.0.7.tar.gz
RUN tar -zxvf 5.0.7.tar.gz -C /usr/src/redis
RUN cd /usr/src/redis/redis-5.0.7 && make && make PREFIX=/usr/local/redis install
docker build -t redis5 .
根据上面的运行结果我们可以看到在执行一行RUN之后就会出现一个 ---> Running in xxxx
的信息,对于dockerfile的知心来说它会没执行一行命令就会创建一个 临时镜像,然后下面的命令就会基于这个镜像继续构建,构建完就删除前面的镜像,直到最后一步生成我们的目标镜像。
命令执行注意实现
在docker中的设计是采用文件系统,而在dockerfile中一个RUN代表一层曾经是最大不得超过 42 层,现在是不得超过 127 层。而且在docker中下载的文件是会占用 一定的资源,对于容器我们是尽量占用足够小的资源所以下载安装之后就要删除文件。对于命令之间我们通常是建议一些能一起执行的命令放在一起执行可通过 " "分割
所以对于上面的错误主要包含有
- 下载安装的文件没有删除
- RUN的层次太多
所以正确的写法应该如下
FROM centos
RUN groupadd -r redis && useradd -r -g redis redis
RUN yum update -y ; \
yum -y install gcc automake autoconf libtool make wget epel-release gcc-c++;
RUN mkdir -p /usr/src/redis; \
wget https://github.com/antirez/redis/archive/5.0.7.tar.gz; \
tar -zxvf 5.0.7.tar.gz -C /usr/src/redis; \
rm -rf 5.0.7.tar.gz; \
cd /usr/src/redis/redis-5.0.7 && make && make PREFIX=/usr/local/redis install;
别忘了通过docker images查看
docker hub 发布
这个有点类似于composer的仓库地址就是用来存储我们开会人员的镜像地址的;
官网:https://hub.docker.com
自己注册一个账号,这个过程我就跳过
~ docker login
Username: shineyork
Password:
Login Successded
异常!
在上面执行的代码可能出现如下异常error response from daemon: Get https://registry-1.docker.io/v2/library/hello-world/manifest
这个问题的异常主要是
- 解析ip不可用
- 是因为dns域名没有解析的原因;
解决:
~ yum install bind-utils
~ dig @114.114.114.114 registry-1.docker.io
; <<>> DiG 9.11.4-P2-RedHat-9.11.4-9.P2.el7 <<>> @114.114.114.114 registry-1.docker.io
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 57840
;; flags: qr rd ra; QUERY: 1, ANSWER: 8, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;registry-1.docker.io. IN A
;; ANSWER SECTION:
registry-1.docker.io. 33 IN A 34.205.88.205
registry-1.docker.io. 33 IN A 35.169.133.189
registry-1.docker.io. 33 IN A 34.202.247.184
registry-1.docker.io. 33 IN A 3.224.11.4
registry-1.docker.io. 33 IN A 3.82.34.201
registry-1.docker.io. 33 IN A 34.195.36.112
registry-1.docker.io. 33 IN A 3.221.133.86
registry-1.docker.io. 33 IN A 3.224.75.242
;; Query time: 26 msec
;; SERVER: 114.114.114.114#53(114.114.114.114)
;; WHEN: 三 4月 22 04:41:31 CST 2020
;; MSG SIZE rcvd: 177
~ vi /etc/hosts
34.205.88.205 registry-1.docker.io
~ systemctl restart docker
登入成功之后,使用push命令就可以上传镜像,如果不指定tag则本地的镜像都会上传。如下实例:
注意docker hub的push要求是如下格式
docker push 注册名/镜像名:tag
因为我们创建的镜像是redis5不符合规划
[root@localhost 01]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
redis5 latest 49071214d162 34 minutes ago 774MB
centos latest 470671670cac 3 months ago 237MB
执行tag修改
[root@localhost 01]# docker tag redis5 shineyork/redis5:v1
[root@localhost 01]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
redis5 latest 49071214d162 44 minutes ago 774MB
shineyork/redis5 v1 49071214d162 44 minutes ago 774MB
centos latest 470671670cac 3 months ago 237MB
建议可以先在dockerhub中建议仓库
[root@localhost 01]# docker push shineyork/redis5:v1
The push refers to repository [docker.io/shineyork/redis5]
20c820832bb0: Layer already exists
9b476962a36c: Layer already exists
89594a1f898a: Layer already exists
0683de282177: Layer already exists
v1: digest: sha256:056d54c22dd8af8f765baf9fc78ac4a0772c4ee7fddabccaeae80845ed7edb7b size: 1162
最终如下结果
然后我们可以rmi掉本地的镜像,pull我们自己上传的镜像
[root@localhost 01]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos latest 470671670cac 3 months ago 237MB
[root@localhost 01]# docker pull shineyork/redis5:v1
v1: Pulling from shineyork/redis5
8a29a15cefae: Pull complete
46bec8964c2b: Pull complete
db4fd5d9e637: Pull complete
395f6c8aea1b: Pull complete
Digest: sha256:056d54c22dd8af8f765baf9fc78ac4a0772c4ee7fddabccaeae80845ed7edb7b Status: Downloaded newer image for shineyork/redis5:v1
[root@localhost 01]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
shineyork/redis5 v1 49071214d162 13 hours ago 774MB
centos latest 470671670cac 3 months ago 237MB
容器
基础操作
我们可以基于镜像与构建容器
docker run -itd --name 容器名称(自定义) 镜像名称:标识
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
OPTIONS说明:
-a stdin: 指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项;
-d: 后台运行容器,并返回容器ID;
-i: 以交互模式运行容器,通常与 -t 同时使用;
-t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
--name="nginx-lb": 为容器指定一个名称;
--dns 8.8.8.8: 指定容器使用的DNS服务器,默认和宿主一致;
--dns-search example.com: 指定容器DNS搜索域名,默认和宿主一致;
-h "mars": 指定容器的hostname;
-e username="ritchie": 设置环境变量;
--env-file=[]: 从指定文件读入环境变量;
--cpuset="0-2" or --cpuset="0,1,2": 绑定容器到指定CPU运行;
-m :设置容器使用内存最大值;
--net="bridge": 指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型;
--link=[]: 添加链接到另一个容器;
--expose=[]: 开放一个端口或一组端口;
如下为创建过程
容器类型:
- 交互型容器:运行在前台,通常会制定有交互的控制台,可以给容器输入,也可以得到容器的输出。创建该日期的终端被关闭,在容器内部使用 exit命令或者调用docker stop 、docker kill命令后,容器会
- 后台型容器:运行在后台,创建启动之后就与终端无关。即便终端关闭了,改后台容器也依然存在,只有执行docker stop或者docker kill命令 时候才能够使容器变成停止状态
我们可以进入容器中的系统:
如上命令我们就相当于进入容器中的系统了,同时我们也可以启动容器中的redis
我们可以查看容器中的进程,通过如下命令:
查看镜像的历史
~ docker history 镜像
Docker容器的迁移处理
-
export 与 import
docker的流行与它对容器的易分享和易移植密不可分。用户不仅可以把容器提交到公共服务器上,还可以将容器导出到本地文件系统中。同样我们也可以讲导出的 容器重新导入到docker运行环境中。docker的导入和导出分别由import命令和export命令完成。
docker export命令会把容器的文件系统以tar包的格式导出到标准输出,我们将其重定位到目标文件name.tar。将容器保存到本地文件也算是其持久化方式的一种。 将容器保存到本地之后,我们就可以通过网络等方法将tar包分享给他人。反过来,我们可以使用docker import命令 导人一个本地的tar包作为镜像:
接下来我们通过docker run构建容器:
第一次运行报错是因为docker的bug,因为没有一个前台进程在运行 而加上 bash,top等命令 就是跟docker一个挂起在前台的界面 -
save 与 load
docker save : 将指定镜像保存成 tar 归档文件。docker save [OPTIONS] IMAGE [IMAGE…]
OPTIONS 说明:
-o :输出到的文件。