Linux-Docker-1-基础

什么是Docker?

官网:https://www.docker.com/html

开源:https://github.com/dockermysql

Docker是一个开源的应用容器引擎,支持将软件编译成一个镜像,而后在镜像中各类作好配置,将镜像发布出去,其它使用者直接使用这个镜像。容器启动是很是讯速的。相似windows里面的ghost操做系统,安装好后什么都有了。linux

Docker核心概念

Docker核心概念:nginx

  • docker主机(Host):一个物理或虚拟的机器用于执行Docker守护进程和容器(安装了Docker程序的机器,能够是Linux或windows)
  • docker客户端(Client):客户端经过命令或其它工具使用Docker API()与Docker的守护进程通讯
  • docker仓库(Registry):用来保存打包好的镜像,能够理解为代码控制中的代码仓库。Docker Hub(https://hub.docker.com)提供了庞大的镜像集合供使用。
  • docker镜像(Images):用于建立Docker容器的模板
  • docker容器(Container):镜像启动后的实例称为一个容器;容器是一个独立运行的一个或一组应用

Docker使用步骤:git

1)安装Dockergithub

2)去Docker仓库找到这个软件对应的镜像redis

3)使用Docker运行这个镜像,这个镜像就会生成一个Docker容器sql

4)对容器的启动中止就是对软件的启动中止docker

安装Docker(Linux)

1)环境:CentOS七、shell

Docker要求CentOS内核版本高于3.10,若是版本太低,能够用yum update升级内核版本

2)安装

yum update #更新内核到3.10以上

yum install docker

systemctl start docker #启动docker

systemctl enable/disable docker #设为/关闭开机启动

systemctl stop docker #中止docker

启动失败

解决办法:vim /etc/sysconfig/docker,设置--selinux-enabled=false

参考了:https://blog.csdn.net/kavito/article/details/81200665

总结:将centos7的内核升级至最新后再安装docker能够减小不少错误,另外还须要禁用sell linux。

[root@eureka1 test]# systemctl enable docker
Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.

安装Docker(Windows)

Docker Desktop requires Windows 10 Pro or Enterprise version 14393 to run.

经常使用操做

1、镜像操做

操做 命令 说明
检索 docker search xxx,如:docker search redis 检索镜像,做用不大,还不如到官网上检索 https://hub.docker.com/
拉取 docker pull 镜像名:tag :tag是可选的,tag表示标签,多为软件版本,默认为latest
列表 docker images 查看全部本地镜像
删除 docker rmi image-id 删除指定的本地镜像
清理镜像 docker image prune 清除一些遗留的临时镜像,释放空间
- docker commit -m="提交的描述信息" -a="做者" 容器ID 要建立的目标镜像名:[TAG] 提交容器副本使之成为一个新的镜像

示例:

搜索镜像

[root@localhost test]# docker search mysql
INDEX       NAME                                        DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
docker.io   docker.io/mysql                             MySQL is a widely used, open-source relati...   8345      [OK]       
docker.io   docker.io/mariadb                           MariaDB is a community-developed fork of M...   2860      [OK]       
docker.io   docker.io/mysql/mysql-server                Optimized MySQL Server Docker images. Crea...   623                  [OK]
docker.io   docker.io/percona                           Percona Server is a fork of the MySQL rela...   438       [OK]       
docker.io   docker.io/centurylink/mysql                 Image containing mysql. Optimized to be li...   60                   [OK]
docker.io   docker.io/centos/mysql-57-centos7           MySQL 5.7 SQL database server                   57                   
docker.io   docker.io/mysql/mysql-cluster               Experimental MySQL Cluster Docker images. ...   45

下载镜像

[root@localhost test]# docker pull mysql:5.5
...

怎么知道有哪些可用的tag?官网上搜索会提示有哪些可用的tags https://hub.docker.com/


解决镜像下载慢的问题:

1)登陆阿里云 https://www.aliyun.com/ ,查看镜像加速地址,如:https://chohcg90.mirror.aliyuncs.com

2)vim /etc/docker/daemon.json,修改以下:

{
"registry-mirrors": ["https://chohcg90.mirror.aliyuncs.com"]
}

参考:https://www.cnblogs.com/kevin7234/p/10617734.html


将镜像提交到阿里云

1)登陆阿里云,建立镜像仓库

2)本地上传镜像到刚刚建立的镜像仓库

建立镜像仓库后,上面有文档参考

2、容器操做

软件镜像(QQ安装程序)---》运行镜像---》产生一个容器(正在运行的QQ)

操做 命令 说明
运行 docker run --name container-name -d image-name <br> 如:docker run -name myredis -d redis --name:自定义容器名 <br> -d:后台运行 <br> image-name:指定镜像模板
列表 docker ps(查看运行中的容器) docker ps -a 能够查看全部容器
中止 docker stop/kill container-name/container-id 中止当前运行的容器
启动 docker start/restart container-name/container-id 启动容器
删除 docker rm container-id <br> docker rm -f $(docker ps -q) 删除所有在运行的容器 <br> docker rm -f $(docker ps -a -q) 删除全部容器 删除指定的容器
端口映射 -p 6379:6379 <br> 如:docker run -d -p 6379:6379 --name myredis redis -p:主机端口(映射到)容器内部的端口
容器日志 docker logs container-name/container-id [OPTIONS] -t 加入时间戳 <br> -f 跟随最新的日志打印 <br> --tail x(x是数字) 显示最后多少行
查看容器内运行的进程 docker top 容器id
查看容器内部细节 docker inspect 容器id 查看容器的内部细节,包括IP、网桥
进入正在运行的容器 <br> 并以命令行交互 docker exec -it 容器ID bashShell <br> docker container exec -it nginx1 /bin/bash <br> docker attach 容器ID 区别:<br> attach 直接以命令交互方式进入容器 <br> exec 不用进入容器却能执行容器的命令
从容器拷贝文件到主机上 docker cp 容器ID:容器内路径 目标主机路径
更多命令

容器启动命令 docker run,格式:docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

OPTIONS,有些是一个减号,有些是两个减号

  • --name = "给容器起个名字"

  • -d 后台运行,并返回容器ID

  • -i 以交互模式运行容器,一般与 -t 同时使用

  • -t 为容器从新分配一个伪输入终端,一般与 -i 同时使用

  • -P 随机端口映射

  • -p 指定端口映射

    • ip:hostPort:containerPort
    • ip::containerPort
    • hostPort:containerPort,这个经常使用
    • containerPort

例如在docker上启动ctntos

docker run -it 9f38484d220f

退出centos

  • exit,彻底退出并关闭容器
  • 快捷键:ctrl + P + Q,暂时退出但不关闭容器

从新进入centos

  • 方式一:
docker exec -t 容器ID /bin/bash
  • 方式二:
docker attach 容器ID

docker exec -t 容器ID ls -l /tmp能够直接执行容器中的命令而不用进入容器中的命令行界面,“隔山打牛”。


docker ps [OPTIONS]

  • -a 全部历史记录的容器
  • -l 上一次打开的容器
  • -n x(x是数字),最近打开过的x个容器
  • -q 查出正在运行的容器ID,批量删除容器:docker rm -f $(docker ps -q) ——20190704

文件拷贝

  • 从宿主机拷贝文件到容器中:docker cp 须要拷贝的文件或目录 容器名称:容器目录
  • 从容器拷贝文件到宿主机中:docker cp 容器名称:容器目录 宿主机目录

目录挂载

-v 参数

目录挂载是为了方便在宿主机编辑文件,而后会同步到容器上,程序运行,最终是按容器中的目录

镜像原理

这是金鱼背上的一个集装箱

相关概念:

  • UnionFS(联合文件系统)
  • bootfs,
  • rootfs,在bootfs之上,包含的就是典型的Linux中的/dev,/proc,/bin,/etc等标准目录和文件,rootfs就是各类不一样的操做系统发行版本,如ubuntu、centos。

数据卷

数据卷:对容器数据的持久化,持久化到主机上,容器与主机之间的数据共享。

-v 参数

命令:

docker run -it -v /宿主机绝对路径目录:/容器内目录 镜像名或id

命令(带权限)

docker run -it -v /宿主机绝对路径目录:/容器内目录:ro 镜像名或id
  • 默认是可读可写
  • :ro 只读,容器只能读,主机可读可写

总结:-v除了目录映射外,还能够文件映射,即:-v /宿主机绝对路径文件:/容器内的文件,如nginx.conf ——20191121

DockerFile

1)在主机根目录下新建mydocker目录并进入

# cd /
# mkdir /mydocker
# cd /mydocker/

2)在Dockerfile中使用 VOLUME 指令来给镜像添加一个或多个数据卷

# vim DockerFile

内容以下:

FROM centos
VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]
CMD echo "finished,-----------success1"
CMD /bin/bash

3)build生成新的镜像

# docker build -f /mydocker/DockerFile -t zzyy/centos .

4)运行刚刚生成的容器容器

# docker run -it zzyy/centos

在根目录下能够看到多个两个卷

5)备注

若是出现容器卷不能写,出现cannot open directory:Permission denied

解决办法:在挂载目录后多加一个 --privileged=true 参数

容器数据卷

是什么

命名的容器挂载数据卷,其它容器经过容器经过挂载这个(父容器)实现数据共享,挂载数据卷的容器称之为数据卷容器。

一句话:活动硬盘上挂活动硬盘,实现数据的传递依赖。

数据共享

上面已经建立了一个 zzyy/centos 镜像,而且有了两个数据卷 dataVolumeContainer一、dataVolumeContainer2

[root@localhost ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
zzyy/centos         latest              e8c61129663a        9 hours ago         202 MB
...

[root@localhost ~]# docker run -it --name dc01 zzyy/centos
[root@3da5bea8d5d8 /]# ll
total 12
-rw-r--r--.   1 root root 12082 Mar  5 17:36 anaconda-post.log
lrwxrwxrwx.   1 root root     7 Mar  5 17:34 bin -> usr/bin
drwxr-xr-x.   2 root root     6 Jul  4 16:19 dataVolumeContainer1
drwxr-xr-x.   2 root root     6 Jul  4 16:19 dataVolumeContainer2
drwxr-xr-x.   5 root root   360 Jul  4 16:19 dev
drwxr-xr-x.   1 root root    66 Jul  4 16:19 etc
...
[root@3da5bea8d5d8 /]# cd dataVolumeContainer2/                     // 在这个容器的这个目录,建立一个文件
[root@3da5bea8d5d8 dataVolumeContainer2]# touch dc01_add.txt

ctrl + p + q

[root@localhost ~]# docker run -it --name dc02 --volumes-from dc01 zzyy/centos
[root@61be3fe9262b /]# ll
total 12
-rw-r--r--.   1 root root 12082 Mar  5 17:36 anaconda-post.log
lrwxrwxrwx.   1 root root     7 Mar  5 17:34 bin -> usr/bin
drwxr-xr-x.   2 root root     6 Jul  4 16:19 dataVolumeContainer1
drwxr-xr-x.   2 root root    26 Jul  4 16:20 dataVolumeContainer2
drwxr-xr-x.   5 root root   360 Jul  4 16:28 dev
...
[root@61be3fe9262b /]# cd dataVolumeContainer2
[root@61be3fe9262b dataVolumeContainer2]# ll
total 0
-rw-r--r--. 1 root root 0 Jul  4 16:20 dc01_add.txt                 // 这个文件是从 dc01容器继承过来的
[root@61be3fe9262b dataVolumeContainer2]# 
[root@61be3fe9262b dataVolumeContainer2]# touch dc02_add.txt

ctrl + p + q

[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
61be3fe9262b        zzyy/centos         "/bin/sh -c /bin/bash"   11 minutes ago      Up 11 minutes                           dc02
3da5bea8d5d8        zzyy/centos         "/bin/sh -c /bin/bash"   19 minutes ago      Up 19 minutes                           dc01

[root@localhost ~]# docker run -it --name dc03 --volumes-from dc01 zzyy/centos
[root@d541e9e3b6a2 /]# cd dataVolumeContainer2
[root@d541e9e3b6a2 dataVolumeContainer2]# ll
total 0
-rw-r--r--. 1 root root 0 Jul  4 16:20 dc01_add.txt
-rw-r--r--. 1 root root 0 Jul  4 16:38 dc02_add.txt                 // 也有前两个容器的文件
[root@d541e9e3b6a2 dataVolumeContainer2]# 
[root@d541e9e3b6a2 dataVolumeContainer2]# touch dc03_add.txt

ctrl + p + q

[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
d541e9e3b6a2        zzyy/centos         "/bin/sh -c /bin/bash"   5 minutes ago       Up 5 minutes                            dc03
61be3fe9262b        zzyy/centos         "/bin/sh -c /bin/bash"   19 minutes ago      Up 19 minutes                           dc02
3da5bea8d5d8        zzyy/centos         "/bin/sh -c /bin/bash"   28 minutes ago      Up 28 minutes                           dc01
[root@localhost ~]# docker attach dc01
[root@3da5bea8d5d8 dataVolumeContainer2]# ll
total 0
-rw-r--r--. 1 root root 0 Jul  4 16:20 dc01_add.txt
-rw-r--r--. 1 root root 0 Jul  4 16:38 dc02_add.txt
-rw-r--r--. 1 root root 0 Jul  4 16:47 dc03_add.txt                 // dc01容器有子容器添加的文件
[root@3da5bea8d5d8 dataVolumeContainer2]#

整理:dc0二、dc03的父类都是dc01,子到父,父到子均可以传递文件。

若是此时将父容器dc01删掉,dc02和dc03之间数据仍是共享的,也就是文件是共享的,数据卷的生命周期一直持续到没有容器使用它为止。

DockerFile

是什么

Dockerfile是用来构建Docker镜像的构建文件,是由一系列命令、参数构成的脚本。

三个步骤

1)编写DockerFile文件

2)docker build

3)docker run

文件长什么样子的?以centos6.8为例

FROM scratch
MAINTAINER The CentOS Project <cloud-ops@centos.org>
ADD c68-docker.tar.xz /
LABEL name="CentOS Base Image" \
    vendor="CentOS" \
    license="GPLv2" \
    build-date="2016-06-02"

# Default command
CMD ["/bin/bash"]

构建过程解析

DockerFile内容基础知识:

  • 每条保留字指令都必须为大写字母且后面跟随至少一个参数
  • 指令按照从上到下顺序执行
  • #表示注解
  • 每条指令都会建立一个新的镜像层,并对镜像进行提交

执行大体流程

  1. 从基础镜像运行一个容器
  2. 执行一条指令并对容器做出修改
  3. 执行 docker commit 提交一个新的镜像层
  4. 基于刚刚提交的镜像运行一个新的容器
  5. 执行下一条指令直至全部指令都执行完成

体系结构(保留字指令)

  • FROM
  • MAINTAINER
  • RUN
  • EXPOSE
  • WORKDIR
  • ENV
  • ADD
  • COPY
  • VOLUME
  • CMD
  • ENTRYPOINT
  • ONBUILD

解释

  • FROM,基础镜像,当前镜像是基于哪一个镜像的
  • MAINTAINER,镜像维护者的姓名、邮箱
  • RUN,容器构建时须要执行的命令
  • EXPOSE,当前容器对外暴露的端口
  • WORKDIR,指定在容器建立后,终端默认登陆进来的工做目录,落脚点
  • ENV,用来在构建镜像过程当中设置环境变量,定义变量后,后面的指令就可使用$来获取定义的变量
ENV MY_PATH /usr/mytest
...
WORKDIR $MY_PATH
  • ADD,将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar压缩包
  • COPY,相似ADD,只是拷贝,从<源路径>拷贝到<目标路径>
    • COPY src dest
    • COPY ["src","dest"]
  • VOLUME,容器数据卷,用于数据保存、待久化,VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]
  • CMD,指定一个容器启动时运行的命令,能够有多个CMD命令,但只有最后一个生效,CMD会被 docker run 以后的参数替换
  • ENTRYPOINT,指定一个容器启动时运行的命令,跟CMD同样,都是在指定容器启动程序及参数,区别是:CMD命令可能被替换,而ENTRYPOINT能够追加命令
  • ONBUILD,在构建一个被继承的DockerFile时运行命令,父镜像在被子继承后交镜像的onbuild被触发

案例

自定义mycentos

让精简版的centos具备如下功能:

  1. 登陆后的默认路径
  2. vim编辑器
  3. 支持ifconfig查看网络

步骤:

1)在宿主机根目录下的mydocker目录下建立一个DockerFile

cd /
cd /mydocker
vim DockerFile2

内容以下:

FROM centos
MAINTAINER zzyy<zzyy167@126.com>

ENV MYPATH /usr/local
WORKDIR $MYPATH

RUN yum -y install vim
RUN yum -y install net-tools

EXPOSE 80

CMD echo $MYPATH
CMD echo "success......ok"
CMD /bin/bash

2)构建

docker build -f /mydocker/DockerFile2 -t mycentos:1.3 .

注意:最后有个点.表明当前路径

3)运行

docker run -it mycentos:1.3

默认进入 /usr/local 目录,也能使用 vim/ifconfig 命令了

4)列出镜像变动历史

docker history 镜像ID

docker history 8911244c3084

FAQ

Docker容器开机自动启动

在使用docker run启动容器时,使用--restart参数来设置:

# docker run -m 512m --memory-swap 1G -it -p 58080:8080 --restart=always --name bvrfis --volumes-from logdata mytomcat:4.0 /root/run.sh

--restart具体参数值详细信息:

  • no - 容器退出时,不重启容器;
  • on-failure - 只有在非0状态退出时才重新启动容器;
  • always - 不管退出状态是如何,都重启容器;

参考:https://blog.csdn.net/menghuanbeike/article/details/79261828

附件

Docker相关书

http://www.javashuo.com/article/p-ctohgjuq-dd.html

https://blog.csdn.net/icannotdebug/article/details/82352825

相关文章
相关标签/搜索