Docker学习笔记-1

1. 基本概念

Docker就像一个极简版的Linux环境(包括用户空间,进程空间,网络空间等),可以达到“一次封装,到处使用”的效果。这里的的“封装”包括了运行环境,配置和代码等。
Docker的运行环境要求在CentOS6.5以上,Linux内核要求2.6.32-431以上。

  • 仓库(Repository)
    仓库是集中存放镜像文件的场所。仓库(Repository)和仓库注册服务器(Registry)是有区别的。仓库注册服务器上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像又有不同的标签Tag。
  • 仓库分为公开(Public)仓库和私有(Private)仓库
  • 仓库,镜像和容器
    Docker本身是一个容器运行载体或称之为管理引擎。把应用程序和配置依赖打包好形成一个可交付的运行环境,这个打包好的运行环境就是image镜像文件。只有通过这个镜像文件才能生成Docker容器。image可以看成容器(Container)的模版。Docker根据image文件生成容器实例。同一个image文件可以生成多个同事运行的容器实例。
    这里镜像(image)相当于类(Class),而容器(Container)相当于对象(Object)。
    • 一个容器运行一种服务,需要时可以通过Docker客户端创建一个对应的运行实例——容器。
    • 仓库是存放一对镜像的地方。我们可以把镜像发布到仓库中,需要时从仓库pull下来。
2. Docker的安装
  • Docker的版本
    Docker-CE:社区版
    Docker-EE:企业版

  • CentOS6.8

yum install -y epel-release
yum install -y docker-io
配置文件 /etc/sysconfig/docker
service docker start
docker version
  • CentOS7
yum install -y epel-release
yum install -y docker-ce
配置文件 /etc/sysconfig/docker
systemctl start docker
docker version
  • 配置163镜像加速地址
# vim /etc/sysconfig/docker   # cenos6
# other_args="--registry-mirror=http://hub-mirror.c.163.com"
# centos7
mkdir -p /etc/docker
vim /etc/docker/daemon.json
systemctl restart docker
-----------------------------------------
{
  "registry-mirrors": ["http://hub-mirror.c.163.com"]
}
  • Docker加速地址
docker官网中国区镜像
--registry-mirror=https://registry.docker-cn.com

USTC镜像加速
--registry-mirror=https://docker.mirrors.ustc.edu.cn

daocloud镜像 需注册
--registry-mirror=http://{your_id}.m.daocloud.io

alicloud 注册后有自己的加速地址
--registry-mirror=https://{your_id}.mirror.aliyuncs.com

通过如下命令查看Docker容器有没有带加速地址
ps -ef | grep docker
3. 测试实例
docker run hello-world

4. 基本命令解析
  • 获得帮助
docker info
docker --help
  • 列出本地主机上的镜像
docker images [option] <image>
option:
-a 列出本地所有的镜像(含中间镜像层)
-q 显示当前的镜像ID
--digest 显示镜像的摘要信息
--no-trunc 显示完整的镜像信息
  • 查找镜像
docker search <image> https://hub.docker.com
docker serach [option]
option:
--no-trunc 显示完整的镜像描述
-s 列出收藏数不小于指定值的镜像
--automated 只列出automated build类型的镜像
  • 下载镜像
docker pull <image>
docker pull <image>[:TAG]
TAG即为版本号,默认TAG是latest
  • 删除镜像
删除某个镜像
docker rmi <image>[:TAG]
docker rmi -f hello-world 强制删除存在容器实例的镜像(hello-world可以换成ID值)

删除多个镜像
docker rmi -f <image>:TAG <image>:TAG

删除全部镜像
docker rmi -f $(docker images -qa)
  • 容器类命令
    docker run [options] image [command] [args…]
    这里image可以是名字或者ID。
    options:
--name="容器名"  为容器指定一个名称
-d 后台运行容器,并返回容器ID(启动为守护进程)
-i 以交互模式运行容器,一般与-t参数配合使用
-t 为容器重新分配一个伪终端
-P 随机端口映射
-p 指定端口映射,有以下四种形式:
    IP:HostPort:ContainerPort
    IP::ContainerPort
    HostPort:ContainerPort
    ContainerPort

端口显示例子
0.0.0.0:8888->8088/tcp
         |      |------>ContainerPort
         |------------->HostPort

常用命令形式:
docker run -it --name=test <容器ID>
  • 列出当前所有正在运行的容器
    所有运行的运行过的容器都会被缓存。
docker ps [options]
options:
-a 列出当前所有正在运行的容器,含历史上运行过的容器(缓存的容器)
-l 显示最近创建的容器
-n 显示最近n个创建的容器
-q 静默模式,只显示容器编号
--no-trunc 显示详细信息

查看最近创建的容器
docker ps -l
查看前边三次运行的容器
docker ps -n 3
查看运行后退出的容器
docker ps -f status=exited
  • 退出容器
exit 停止容器并退出
Ctrl + p + q 不停止容器并退出
  • 运行一个容器
    运行的容器在退出后将被系统缓存。缓存下来的所有容器可以用 docker ps -a 显示。
docker run -it --name=<name> <image>
name标识为NAMES,表示别名。
image是镜像名。
  • 启动缓存中已停止的容器
    一个start省去了docker run时附带的一大堆参数。这些参数都缓存在了系统中,一个start就会按照原来的参数启动容器。
docker start <容器ID/容器名>
  • 重启缓存中已停止的容器
    restart也会自动启用原docker run时附带的参数。
docker restart <容器ID/容器名>
  • 正常停止容器
docker stop <容器ID/容器名>
  • 强制停止容器
docker kill <容器ID/容器名>
  • 删除已停止的容器
docker rm <容器ID>
容器ID:
~ 被缓存在内存中
~ 完整容器ID的前 “12” 位
  • 删除没有停止的容器
    同时清除掉缓存的容器信息。
docker rm -f <容器ID>
在运行容器时给出 --rm 参数,可以保证在容器停止后自动删除该容器(包括缓存的信息)。
docker run --name=nginx04 -p 80:80 --rm <container_id>
  • 一次性删除多个容器(包括缓存的容器)
docker rm -f $(docker ps -qa)
docker ps -a -q | xargs docker rm
  • 后台方式启动一个容器
docker run -d <image>
发现的问题:看到容器一闪而退

原因:
Docker 容器在后台运行必须有一个前台进程
容器运行的命令如果不是那些一直挂起的命令(top,tail等),就会一闪而退。
如果容器内没有前台运行的应用,容器在后台启动后会立即kill自己。

解决方法:
docker run -it centos /bin/bash
这里centos是image
/bin/bash可以省略

例子
docker run -d centos /bin/sh -c "while true; do echo hello zzyy; sleep 2; done"
docker run -it -p 8080:8081 bee/tomcat:1.2
8080是HostPort
8081是ContainerPort

后台启动一个容器并回到宿主机
docker run -id --name=test01  <IMAGE ID>
  • 查看容器日志
docker logs -f -t --tail 3 <容器ID>
-f follow 打印最新的日志条目
-t 加入时间戳
--tail 3 表示显示最后3条记录

宿主机日志目录
/var/lib/docker/containers/<container-id>/
日志文件:<container-id>-json.log
  • 查看容器内的进程
docker top <容器ID>
  • 查看资源占用情况
docker status <容器ID>
  • 查看容器内部细节
docker inspect <容器ID>
  • 重新进入运行的容器
法一:交互模式,直接进入容器命令行终端。
docker exec -it <容器ID> /bin/bash
exec 在容器中打开终端,并且可以启动新的进程。

法二:非交互模式,不进入容器的命令行界面(没有提示符)。
docker attach <容器ID>
attach 不能启动新的进程。

也可以不进入容器内的命令行界面而在容器内运行命令
docker exec -t <容器ID> ls -l /tmp
  • 从宿主机拷贝文件到容器内
docker cp /root/data/dog.jpg <container-id>:/tmp
docker cp /root/data/dog.jpg <container-id>:/tmp/cat.jpg
docker cp /root/data/ <container-id>:/tmp
  • 从容器内拷贝文件到宿主机上
docker cp <容器ID>:path dest-host-path
5. 镜像原理

镜像是一种轻量级,可执行的独立软件包,用来打包软件运行环境开发的软件。它包含运行某个软件所需的所有内容:包括代码,运行时库,环境变量和配置文件。

6. UnionFS(联合文件系统)

UnionFS是一种分层,轻量级并且高性能的文件系统。它将每次文件系统的修改以逐层叠加的方式提交,同时可以将不同目录挂载到同一个虚拟文件系统下(unite Several directories into a single virtual filesystem)。UnionFS是Docker镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(不是父镜像)可以制作各种具体的应用镜像。

特性:
一次同时加载多个文件系统,从外部看只能看到一个文件系统。联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层文件和目录。

7. Docker镜像加载原理

Docker的镜像实际上由一层层的文件系统组成,即UnionFS。
bootfs(boot file system)主要包括boot loader和kernel。boot loader主要引导加载kenel。Linux刚启动时会加载bootfs文件系统。Docker镜像的最底层是bootfs,包含boot loader和kernel。当boot加载完成后整个kernel就都在内存中了。此时内存的使用权由bootfs交给内存,接着系统卸载bootfs。
rootfs(root file system),在bootfs之上,包含/dev,/proc,/bin,/etc,等目录和文件。rootfs可以很小,只需要包括最基本的命令,工具和程序库就可以了。底层直接用宿主机的kernel,自己只需提供rootfs就行了。对于不同的发行版bootfs基本一致,rootfs会有差别。

8. 镜像示意


镜像的每一层都可以被上层共享。

9. 生成镜像(image)
  • 将当前运行的容器变成一个镜像
docker commit
docker commit -m="提交的描述" -a="作者" <运行时的容器ID> <目标image>:[TAG]
这里image可以采用目录形式以提供独立的名字空间。
形如:
xxyy/tomcat
kkzz/tomcat:1.2
  • 使用Dockfile
docker build -f /home/bee/dockerfile2 -t bee/centos .
10. 数据持久化
  • 拷贝容器中的数据到主机
docker cp <容器ID>:容器path 目的主机path
  • 数据卷
    主要用于在Container和Host之间共享数据。
法一:
docker run -it -v /HostPath:/ContainerPath <image>
查看卷的挂载
docker inspect <容器ID>
回显
"volumes":{
	"/container_path":"/host_path"
	...
"VolumesRW":{
	"container_path":true 可读写  (false 只读)

法二:只支持容器内的卷共享
在Dockerfile文件中配置
VOLUME["dataVolumeContainer1","dataVolumeContainer2","dataVolumeContainer3"]
宿主机上的默认目录:
/var/lib/docker/volumes/4087a.../data

命令形式
docker run -it -v /host1:/container1 -v /host2:/container2 centos /bin/bash

宿主机Host上的更新会在Container再次运行后自动同步。
Container的路径只读:

docker run -it -v /host_path:/container_path:ro <image>

注意:
Docker挂载宿主机目录出现Cannot open directory.:Permission denied
处理办法
-v之后增加参数–privileged=true

  • 数据卷容器
    可在Container之间共享数据。
    命名的容器挂载数据卷,其他容器通过挂载这个容器实现数据共享。挂载数据卷的容器称之为数据卷容器。
Ⅰ新建容器dc01
docker run -it --name=dc01 bee/centos
Ⅱ关联数据卷容器dc01
docker run -it --name=dc02 --volumes-from dc01 bee/centos
docker run -it --name=dc03 --volumes-from dc01 bee/centos
Ⅲ 此时如果将dc01容器删除
docker rm -f dc01
dc01被删除后两个子容器dc02和dc03仍然可以实现数据共享。
Ⅳ 再关联子容器
docker run -it --name=dc04 --volume-from dc03 bee/centos
docker rm -f dc03
dc04仍然保持和dc02的数据共享和同步

结论:
容器之间配置信息的传递,数据卷的生命周期一直持续到没有容器使用它为止。
11. Docker生成Image的方法
  • docker commit
  • Dockerfile 通过 docker build
    scratch 基础镜像

Dockerfile的语法规则
(1)保留字必须大写且后边的参数非空。
(2)指令从上到下顺序执行。
(3)#是注释
(4)每条指令都会创建一个新的镜像层,并对创建的镜像进行提交。

Docker执行Dockerfile的大致流程
(1)Docker从基础镜像(scratch)运行一个容器
(2)执行一条指令并对容器做出修改
(3)执行类似Docker commit的操作提交一个新的镜像层
(4)Docker再基于刚才提交的镜像运行一个新容器
(5)执行Dockfile中的下一条指令直到所有指令都执行完

Dockerfile----------->Docker Image----------->Docker Container
             build                    run

Dockerfile的指令

FROM    基础镜像。当前新镜像是基于哪个镜像的。
MAINTAINER    镜像维护者的姓名和邮箱地址。
RUN    容器构建时需要运行的命令
EXPOSE    容器对外暴露的端口
WORKDIR    指定在创建容器后,终端默认登陆进来的工作目录,不指定默认为根目录。
ENV    用来在构建镜像过程中设置环境变量。
    如:ENV MY_PATH /user/mytest
    这个环境变量可以在后续的任何RUN命令中使用,也可以在其他指令中直接使用这些环境变量。如:
    WORKDIR $MY_PATH
ADD    等于COPY + 压缩功能
    将宿主机目录下的文件拷贝进镜像且ADD会自动处理URL和解压tarball。
COPY    拷贝宿主机上的文件和目录到镜像中。
    将从构建上下文目录中(源路径)的文件或目录复制到新的一层的镜像内的(目标路径)位置。
    使用形式:
        COPY src dest
        COPY ["src","dest"]
 VOLUME    容器数据卷,用于数据保存和持久化。
 CMD    指定一个容器启动时要运行的命令
     Dockerfile中可以有多个CMD指令,但只有最后一个生效(多个命令会在构建时都执行,但只有最后一个会在容器启动时执行)。CMD会被docker run后的参数替换。
     ~ shell 格式 CMD <命令>
     ~ exec 格式 CMD ["可执行文件","参数1","参数2",...]
     ~ 参数列表格式
         CMD ["参数1","参数2",...] ,在指定了ENTRYPOINT指令之后,只用CMD提供的具体参数。
ENTERPOINT    指定一个容器启动时要执行的命令。
    执行docker run 后边的内容会被当成参数追加进:
    ENTRYPOINT ["curl","-s","https://www.baidu.com"]
ONBUILD    当构建一个被继承的Dockerfile时运行命令。父镜像在被子镜像继承后,父镜像的ONBUILD将被触发。
  • 根据Dockerfile构建镜像的命令
docker build -t <镜像名>:TAG .
如:
docker build -f /bee/Dockerfile2 -t bee/mytest:1.3 .
docker images
docker run -it bee/mytest:1.3
  • 列出镜像的的变更历史 docker history <镜像名/容器ID>
12. 卸载Docker
systemctl stop docker
yum -y remove docker-ce
rm -rf /var/lib/docker
13. 将本地镜像推送至阿里云
登陆
docker login --username=yourname registry.cn-chengdu.aliyuncs.com
拉取镜像
docker pull registry.cn-chengdu.aliyuncs.com/xxx/yyy:[镜像版本号]
将镜像推送到Registry
docker login --username=yourname registry.cn-chengdu.aliyuncs.com
docker tag [ImageId] registry.cn-chengdu.aliyuncs.com/xxx/yyy:[镜像版本号]
docker push registry.cn-chengdu.aliyuncs.com/xxx/yyy:[镜像版本号]
注:不写TAG默认为latest
14. 例子

--name之后也可以不带“ = ”号接参数。

  • Tomcat
docker run -d -p 9080:8080 --name myt9 
-v /bee/tomcat9/test:/usr/local/apache-tomcat-9.0.8/webapps/test
-v /bee/tomcat9/logs:/usr/local/apache-tomcat-9.0.8/webapps/logs
--privileged=true bee/tomcat9 
  • MySQL
docker run -p 12345:3306 --name mysql
-v /bee/mysql/conf:/etc/mysql/conf.d
-v /bee/mysql/logs:/logs
-v /bee/mysql/data:/var/lib/mysql
-e MYSQL_ROOT_PASSWORD=123456
-d mysql:5.6

docker exec <容器ID> sh -c 'exec mysqldump --all-databases -uroot -p "123456"' > /bee/all-databases.sql

可以使用如下命令查看容器使用的帮助:

[root@com tomcat]# docker run -p 3306:3306 -it <container_id>
=> sourcing 20-validate-variables.sh ...
You must either specify the following environment variables:
  MYSQL_USER (regex: '^[a-zA-Z0-9_]+$')
  MYSQL_PASSWORD (regex: '^[a-zA-Z0-9_~!@#$%^&*()-=<>,.?;:|]+$')
  MYSQL_DATABASE (regex: '^[a-zA-Z0-9_]+$')
Or the following environment variable:
  MYSQL_ROOT_PASSWORD (regex: '^[a-zA-Z0-9_~!@#$%^&*()-=<>,.?;:|]+$')
Or both.
Optional Settings:
  MYSQL_LOWER_CASE_TABLE_NAMES (default: 0)
  MYSQL_LOG_QUERIES_ENABLED (default: 0)
  MYSQL_MAX_CONNECTIONS (default: 151)
  MYSQL_FT_MIN_WORD_LEN (default: 4)
  MYSQL_FT_MAX_WORD_LEN (default: 20)
  MYSQL_AIO (default: 1)
  MYSQL_KEY_BUFFER_SIZE (default: 32M or 10% of available memory)
  MYSQL_MAX_ALLOWED_PACKET (default: 200M)
  MYSQL_TABLE_OPEN_CACHE (default: 400)
  MYSQL_SORT_BUFFER_SIZE (default: 256K)
  MYSQL_READ_BUFFER_SIZE (default: 8M or 5% of available memory)
  MYSQL_INNODB_BUFFER_POOL_SIZE (default: 32M or 50% of available memory)
  MYSQL_INNODB_LOG_FILE_SIZE (default: 8M or 15% of available memory)
  MYSQL_INNODB_LOG_BUFFER_SIZE (default: 8M or 15% of available memory)

For more information, see https://github.com/sclorg/mysql-container
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值