Docker基础学习

12,966 阅读7分钟
一、docker的三要素
1.镜像image       就是一个只读的模板。镜像可以用来创建Docker容器,一个镜像可以创建多容器
2.容器container   docker利用容器独立运行一个或一组应用。容器是用镜像创建的运行实列,可以把容器看做是一个简易版的linux环境。
3.仓库repository  是集中存放镜像文件的场所,最大的公开仓库是Docker Hub(https://hub.docker.com/)


二、配置阿里云镜像加速器。https://cr.console.aliyun.com/cn-hangzhou/mirrors(自己的淘宝账号即可登录)
1.对于已创建的Docker Machine实例,更换镜像源的方法如下
在windows命令行执行docker-machine ssh default 进入default的 VM bash
sudo vi /var/lib/boot2docker/profile
在--label provider=virtualbox的下一行添加 --registry-mirror https://6wicrzn3.mirror.aliyuncs.com (注:这个换成自己专属的加速器地址)
重启docker服务:sudo /etc/init.d/docker restart或者重启VM:exit退出VM bash,在windows命令行中执行docker-machine restart

2.创建一台安装有Docker环境的Linux虚拟机,指定机器名称为default,同时配置Docker加速器地址。(注:需要换成自己专属的加速器地址)
docker-machine create --engine-registry-mirror=https://6wicrzn3.mirror.aliyuncs.com -d virtualbox default

3.镜像的帮助命令
docker info;docker version;docker --help


三、docker镜像命令
(1).docker images(列出本地主机上的镜像)
REPOSITORY      TAG        IMAGE ID        CREATED        SIZE
hello-world     latest     2cb0d9787c4d    2 weeks ago    1.85kB
REPOSITORY:表示镜像的仓库源
TAG:镜像的标签
IMAGE ID:镜像ID
CREATED:镜像创建时间
SIZE:镜像大小
同一仓库源可以有多个TAG,代表这个仓库源的不同个版本,我们使用REPOSITORY:TAG来定义不同的镜像
如果你不指定一个镜像的版本标签,例如你只使用ubuntu,docker将默认使用ubuntu:latest镜像

1.1 docker images -a 列出本地主机上的镜像(含中间映像层)
1.2 docker images -q 只显示镜像ID
1.3 docker images --digests 显示镜像的摘要信息
1.4 docker images --no-trunc 显示镜像的完整信息

(2).docker search(查询某个镜像)
网站:https://hub.docker.com
2.1 docker search 镜像名
2.2 docker search -s 30 镜像名 (点赞数超过30)
2.3 docker search --no-trunc 显示镜像的完整描述
2.4 docker search --automated 只列出automated build类型的镜像

(3).docker pull(拉取镜像:[TAG])

(4).docker rmi(删除镜像:[TAG])
4.1 docker rmi  镜像名|镜像id
4.2 docker rmi -f  镜像名|镜像id (强制删除)
4.3 docker rmi -f  镜像名|镜像id 镜像名|镜像id(删除多个,中间以空格隔开)
4.4 docker rmi -f $(docker images -qa) 删除所有镜像


四、docker容器命令
(1)容器启动
docker run -it 镜像名|镜像id --name 重新命名
--name="容器新名字",为容器指定一个名称
-d:后台运行容器,并返回容器id,也即启动守护式容器
-i:以交互模式运行容器,通常与-t同时使用
-t:为容器重新分配一个伪输入终端,通常与-i同时使用
-P:随机端口映射
-p:指定端口映射,有4种格式:
ip:hostPort:containerPort;ip::containerPort;
hostPort:containerPort;containerPort

(2)列出所有正在运行的容器
docker ps -a|-l|-n 3|-q
-a:列出当前所有正在运行的容器+历史上运行过的
-l:显示最近创建的容器
-n:显示最近n个创建的容器
-q:静默模式,只显示容器编号
-no-trunc:不截断输出

(3)退出容器
exit  关闭并离开容器
ctrl+p q 离开容器  --> 再进入 docker attach 容器id|容器名

(4)重启容器
docker restart 容器id|容器名

(5)关闭容器
docker stop 容器id|容器名

(6)强制停止容器
docker kill 容器id|容器名

(7)删除已停止容器
docker rm 容器id|容器名
docker rm -f 容器id|容器名
docker rm -f $(docker ps -qa) 或 docker ps -qa | xargs docker rm

(四.1)容器命令重要。
启动守护式容器命令:docker run -d 容器id|容器名,但是docker ps查不到了
这说明:docker容器后台运行,就必须有一个前台进程,容器以后台进程模式运行,
就导致了docker前台没有运行的应用,后台会立即自杀,因为他觉得他没用。所以
最佳的方案是,将运行的程序以前台进程的形式运行。
(以下命令,会不停的输出llsydn,所以这个容器不会自杀)
docker run -d 容器id /bin/sh -c "while true; do echo hello llsydn; sleep 2; done"

查看容器日志:docker logs -f -t --tail 容器id
-f 跟随最新的日志打印(会不停的追加)
-t 加入时间戳
--tail 数字 显示最后多少条

查看容器内运行的进程:docker top 容器id

查看容器内部细节:docker inspect 容器id

重新进入容器:docker attach 容器id (直接进入容器启动命令的终端,不会启动新的进程)
             docker exec 容器id(直接进入容器启动命令的终端,并且可以启动新的进程)
             docker exec -it 容器id ls -l /tmp
             docker exec -it 容器id 

从容器内拷贝文件到主机上:docker cp 容器id:容器内路径 目的主机路径
                        docker cp 229d3f057e13:/tmp/yum.log /root


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

(1)UnionFS联合文件系统,Docker镜像加载,分层的镜像

(2)特点:只读;当容器启动,一个新的可写层被加载到镜像的顶部。

(3)docker commit操作。
docker commit 提交容器副本使之成为一个新的镜像。
docker commit -m="描述信息" -a="作者" 容器id 镜像名:[标签名]

docker run -it -p 8888:8080 tomcat(在docker的8080端口启动tomcat,暴露的端口8888)
docker run -it -P tomcat(随机暴露端口)


六、Docker容器数据卷。
容器的持久化,容器间继承+共享数据
(1)容器内添加数据卷。(主机和容器数据的共享)
直接命令添加,docker run -it -v /宿主机绝对路径目录:容器内目录 镜像名
            docker run -it -v /dataVolumeMain:/dataVolumeContainer centos
            使用docker inspect 容器id,可以查看到 "HostConfig": {
                                                    "Binds": [
                                                        "/dataVolumeMain:/dataVolumeContainer"
                                                    ],
                                                 }
            这样的话,在容器里面的dataVolumeContainer目录下,有创建新的文件,
            在主机的dataVolumeMain目录下,也会有的,修改也会同步。容器停止了,主机修改了文件,还是会同步的
            docker run -it -v /dataVolumeMain:/dataVolumeContainer:ro centos (加了ro表示只读)

(2)DockerFile添加数据卷。
vim Dockerfile

# volume test
FROM centos
VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]
CMD echo "finished,---------success"
CMD /bin/bash

docker build -f dockerfile文件的路径 -t 镜像名字:[TAG] .  (注意最后有个点)


七、Dockerfile解析
Dockerfile是用来构建docker镜像的构建文件,是由一系列命令和参数构成的脚本。
构建三步骤:编写Dockerfile文件 ==> docker build ==> docker run
Dockerfile是软件的原材料;Docker镜像是软件的交付品,Docker容器则可以认为是软件的运行态

(1)docker内容基础知识:
1.每条保留字指令必须为大写字母且后面要跟随至少一个参数
2.指令按照从上到下,顺序执行
3.#表示注释
4.每条指令都会创建一个新的镜像层,并对镜像进行提交

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

(3)Dockerfile保留字指令:
1.FROM 基础镜像,当前镜像是基于哪个镜像
2.MAINTAINER 镜像维护者的姓名和邮箱地址
3.RUN 容器构建时需要运行的命令
4.EXPOSE 当前容器对外暴露的端口
5.WORKDIR 指定在创建容器后,终端默认登陆的进来工作目录,一个落脚点
6.ENV 用来构建镜像过程中设置环境变量
7.ADD 将宿主机目录下的文件拷贝进镜像且ADD命令自动处理URL和解压tar压缩包
8.COPY 类似ADD,但不能自动处理URL和解压tar压缩包
9.VOLUME 容器数据卷,用于数据保存和持久化工作
10.CMD 指定一个容器启动时要运行的命令,Dockerfile中可以有多个CMD指令,但只有最后一个生效,CMD会被docker run 之后的参数替换
11.ENTRYPOINT 指定一个容器启动时要运行的命令,但这个指令不会替换,只是在后面拼接
12.ONBUILD 当构建一个被继承的Dockerfile时运行命令,父镜像在被子继承后父镜像的onbuild被触发

(4)Docker安装mysql
1.下载
docker pull docker
2.运行
docker run -p 12345:3306 --name mysql -v /mysql/conf:/etc/mysql/conf.d -v /mysql/logs:/logs -e MYSQL_ROOT_PASSWORD=123456 -d mysql

(5)Docker安装redis
1.下载
docker pull redis
2.运行
docker run -p 6379:6379 --name redis -v /redis/data:/data -v /redis/conf:/usr/local/etc/redis/redis.conf -d redis redis-server /user/local/etc/redis/redis.conf --appendonly yes
3.启动客户端
docker exec -it 容器id redis-cli

(6)自定义的tomcat9的Dockerfile
FROM centos
MAINTAINER llsydn 1091391667@qq.com
#把java与tomcat添加到容器中
ADD jdk-linux-x64.tar.gz /usr/local/
ADD apache-tomcat.tar.gz /usr/local/
#安装vim编辑器
RUM yum -y install vim
#设置工作访问时候的WORKDIR路径,登录落脚点
ENV MYPATH /usr/local/
WORKDIR $MYPATH
#配置java与tomcat环境变量
ENV JAVA_HOME /usr/local/jdk1.8.0_171
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.8
ENV CATALINA_BASE /usr/local/apache-tomcat-9.0.8
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/bin:$CATALINA_BASE/bin
#容器运行时监听的端口
EXPOSE 8080
#启动时运行tomcat
CMD /usr/local/apache-tomcat-9.0.8/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.8/bin/logs/catalina.out


八、Docker本地镜像推送到阿里云
1.在阿里云开发者平台,创建仓库。(命令空间,仓库名称)
https://cr.console.aliyun.com/cn-hangzhou/repositories

2.将镜像推送到阿里云仓库Registry
docker login --username=13543844606li registry.cn-hangzhou.aliyuncs.com
docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/llsydn/mycentos:[镜像版本号]
docker push registry.cn-hangzhou.aliyuncs.com/llsydn/mycentos:[镜像版本号]