入门Docker
1、Docker常用命令总结
镜像相关
# 列出镜像
docker images
# 搜索镜像
docker search ImageName
# 下载镜像
docker pull ImageName
# 删除镜像
docker rmi ImageName/ImageID
# 提交修改
docker commit -m="提交的描述信息" -a="作者" containerId imageName:[TAG]
# 查看docker镜像是怎么制作的
docker history ImageName
# 命名镜像
docker tag imageID ImageName:TAG
容器相关
-
新建容器并启动
# 以下列出多种容器启动方式,其中options参数不针对特定场景,可自定义组合使用。 ################################### docker run -it imageName /bin/bash ################################### options: -it:以交互方式运行 /bin/bash: 提供一个控制台 ############################################# docker run -d --name nginx01 -p 3344:80 nginx ############################################# options: -d:后台运行容器,并返回容器ID --name:为容器起一个名字 -p:指定端口映射,主机端口:容器端口 ############################## docker run -it --rm tomcat:9.0 ############################## options: --rm:用完即删,之前的启动都是后台,停止容器后,容器还在,而加上--rm参数后,容器停止即自动删除 ################################################################################################################ docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.6.2 ################################################################################################################ options: -e:设置环境变量 ################################################################################################################ docker run -d -p 8088:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer ################################################################################################################ options: --restart=always:当docker重启时,自动启动该容器 -v:挂载目录,第一个目录是宿主机目录,第二个目录是容器目录 --privileged=true:container内的root拥有真正的root权限,否则容器内的root只是外部的一个普通用户权限。
-
列出容器
# 列出正在运行的容器 docker ps # 列出所有容器 docker ps -a
-
启动容器
docker start containerId
-
进入容器:
# 开启一个新的终端 docker exec -it containerId /bin/bash # 进入正在执行的终端 docker attach containerId
-
退出容器
# 快捷键 ctrl + P + Q # 命令 exit
-
查看容器日志
######################################### docker logs -f -t --tail 100 containerId ######################################### options: -f:实时跟踪日志 -t:展示时间戳 --tail:输出多少条
-
查看容器内进程信息
docker top containerId
-
从容器内拷贝文件到宿主机
docker cp containerPath hostPath
-
查看容器占用的资源信息
docker stats containerId
-
查看容器的信息
docker inspect containerId
其他
-
查看volum信息
docker volume ls
-
通过Dockerfile构建镜像
docker build -f dockerfilePath -t ImageName:TAG .
2、Docker可视化
portainer工具
portainer
是一个轻量级的管理UI,用于管理不同的docker环境。
# 创建并启动portainer容器
docker run -d -p 8088:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer
options:
--restart=always:当docker重启时,自动启动该容器
-v:挂载目录,第一个目录是宿主机目录,第二个目录是容器目录
--privileged=true:container内的root拥有真正的root权限,否则容器内的root只是外部的一个普通用户权限。
访问宿主机8088端口:
3、小试牛刀
-
部署nginx
docker run -d --name nginx01 -p 3344:80 nginx # 测试 curl localhost:3344 <!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> <style> html { color-scheme: light dark; } body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; } </style> </head> <body> <h1>Welcome to nginx!</h1> <p>If you see this page, the nginx web server is successfully installed and working. Further configuration is required.</p> <p>For online documentation and support please refer to <a href="http://nginx.org/">nginx.org</a>.<br/> Commercial support is available at <a href="http://nginx.com/">nginx.com</a>.</p> <p><em>Thank you for using nginx.</em></p> </body> </html>
-
部署tomcat
docker run -d -p 3355:8080 --name tomcat01 tomcat
-
部署ES+Kibana
docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xmx512m" elasticsearch:7.6.2 # 测试 curl localhost:9200 { "name" : "a82ed4063289", "cluster_name" : "docker-cluster", "cluster_uuid" : "rnaW5-VZRYOpAJJwP7obxg", "version" : { "number" : "7.6.2", "build_flavor" : "default", "build_type" : "docker", "build_hash" : "ef48eb35cf30adf4db14086e8aabd07ef6fb113f", "build_date" : "2020-03-26T06:34:37.794943Z", "build_snapshot" : false, "lucene_version" : "8.4.0", "minimum_wire_compatibility_version" : "6.8.0", "minimum_index_compatibility_version" : "6.0.0-beta1" }, "tagline" : "You Know, for Search" }
4、Docker镜像
Docker是什么?
Docker镜像是一个可执行的独立软件开发包,它包含代码,运行时,库,环境变量,配置文件等。所有的软件和环境,直接打包为docker镜像,就可以跑起来!
UnionFS(联合文件系统)
联合文件系统是一种轻量级的高性能分层文件系统,它支持将文件中的修改信息作为一次提交,一次提交对应一层新的修改记录,修改记录以目录的形式存储在磁盘上,将不同修改目录挂载到同一个虚拟文件系统下,应用看到的是挂载的最终结果。
这使得用户可以基于基础的镜像创建新的镜像,这些镜像共享同一个基础镜像层(即一个镜像可能创建出多个容器,这些容器共享同一个基础镜像) ,提高了存储效率。
当Docker利用镜像启动一个容器时,将在镜像文件系统的最顶端再挂载一个新的可读写的层给容器。容器中的内容更新将会发生在可读写层,如下图的Container layer
。
使用docker history
可查看一个镜像由拿些层组成
docker history tomcat
fb5657adc892 2 days ago /bin/sh -c #(nop) CMD ["catalina.sh" "run"] 0B
<missing> 2 days ago /bin/sh -c set -eux; savedAptMark="$(apt-m… 20.2MB
<missing> 3 days ago /bin/sh -c set -eux; arch="$(dpkg --print-… 343MB
<missing> 3 days ago /bin/sh -c { echo '#/bin/sh'; echo 'echo "$J… 27B
<missing> 3 days ago /bin/sh -c set -eux; apt-get update; apt-g… 11.3MB
<missing> 4 days ago /bin/sh -c apt-get update && apt-get install… 152MB
<missing> 4 days ago /bin/sh -c set -ex; if ! command -v gpg > /… 18.9MB
<missing> 4 days ago /bin/sh -c set -eux; apt-get update; apt-g… 10.7MB
<missing> 4 days ago /bin/sh -c #(nop) ADD file:c03517c5ddbed4053… 124MB
Docker镜像加载原理
bootfs(boot file system)
,包括bootloader
和kernel
,bootloader
主要是引导加载kernel
,将内核加载到内存中后,系统会卸载bootfs
。
rootfs(root file system)
,在bootfs
之上,是各种操作系统发行版(例如ubuntu,centeos,Debian等),rootfs可以很小,只包含最基本的命令,工具和程序库,其内核共享宿主机的内核。所以docker中的ubuntu镜像一般很小,只有几百MB。
Image
,在基础镜像之上创建,新的修改提交创建出新的一层记录。
docker镜像加载的分层结构如下所示: bootfs —> rootfs —> Image
5、容器数据卷
容器数据卷是什么?
目的: 实现数据持久化
方式: 将容器内目录与宿主机目录进行挂载,当在容器内修改文件时,会同步更新到宿主机目录。当容器删除后,文件依然存在于宿主机上,不会被删除。
挂载: 在启动容器时,通过-v
参数进行挂载
# 1、指定路径挂载
docker run -it -v 宿主机目录:容器内目录
# 2、匿名挂载
docker run -it -v 容器内目录
# 3、具名挂载
docker run -it -v 卷名:容器内路径
优势: 修改数据时只需要在本地修改,容器内会自动同步。(节省了从宿主机拷贝或更新文件到容器内的步骤)
实战:使用MySQL同步数据
Dockerhub: https://hub.docker.com/_/mysql
docker run -d -p 3310:3306
-v /export/nisl/qx/test/mysql/conf:/etc/mysql/conf.d
-v /export/nisl/qx/test/mysql/data:/var/lib/mysql
-e MYSQL_ROOT_PASSWORD=123456
--name mysql01
mysql:5.7.36
# -v:挂载配置文件和数据目录到宿主机
# -e: 设置环境变量,定义mysql密码
# --name: 设置容器名称
此时,在宿主机的/export/nisl/qx/test
目录下,已经创建了conf
和data
目录,并且完成了数据的同步
利用本地Navicat
连接数据库
此时,在docker容器和宿主机上也生成了test
目录,证明连接成功,可以在本地对数据库进行操作了!
最后,即使删除了容器,mysql的数据仍然存储在宿主机上,实现了数据持久化!
匿名挂载和具名挂载
-
匿名挂载:挂载目录时不指定卷名称
docker run -d -P --name nginx01 -v /etc/nginx nginx
如下图所示,匿名挂载时创建的卷名是乱码:
-
具名挂载:挂载目录时指定卷名称
docker run -d -P --name nginx02 -v naming-nginx:/etc/nginx nginx
如下图所示,具名挂载创建的卷名是确定的:
-
查看卷:
docker volume inspect naming-nginx
所有的docker卷,在没有指定目录的情况下都是在
/var/lib/docker/volumes/xxxx/_data
目录下
6、Dockerfile
创建一个简单的Dockerfile
Dockerfile是用来构建docker镜像的配置文件,通过它可以生成一个Docker镜像。
如下,编写一个简单的Dockerfile
FROM ubuntu
# 挂载卷,即生成两个卷与容器内的volume01和volume02挂载
VOLUME ["volume01", "volume02"]
CMD echo "----end----"
CMD /bin/bash
构建镜像(注意最后有一个点):
docker build -f /export/nisl/qx/test/Dockerfile -t test/ubuntu:1.0 .
生成容器并查看挂载信息:
# 创建一个容器
docker run -it 80d33ac04384 /bin/bash
exit
# 查看挂载信息
docker inspect d1bd18eca8d8
数据卷容器
目的: 实现容器间的数据共享
实例: 实现多个容器间mysql数据的共享
# 第一个容器
docker run -d -v /etc/mysql/conf.d
-v /var/lib/mysql
-e MYSQL_ROOT_PASSWORD=123456
--name mysql01
mysql:5.7.36
# 第二个容器
docker run -d -v /etc/mysql/conf.d
-v /var/lib/mysql
-e MYSQL_ROOT_PASSWORD=123456
--name mysql02 --volumes-from mysql01
mysql:5.7.36
如下所示,两个容器内的mysql数据(位于/var/lib/mysql目录下)可以实现共享
当删除其中一个容器时,并不影响另一个容器的数据(因为host主机上的卷还存在)
注意:
一旦将数据持久化到了本地,这个时候,本地的数据是不会删除的!
如果需要删除本地的卷,需要使用docker volume prune
命令
(base) nisl@xibeiidaxue-X299-WU8:test$ docker volume prune
WARNING! This will remove all local volumes not used by at least one container.
Are you sure you want to continue? [y/N] y
Deleted Volumes:
b98ff4eb263aa69db16ecca97194271e85430b05b5137f5efea370e410a00083
d6ff04ca0eaed2ed29e587fbf51f039423bdf712915fb53fe62c1fcb088cb872
Total reclaimed space: 126.7MB
Dockerfile构建过程
基础知识:
-
关键字必须是大写字母
-
执行从上到下的顺序执行
-
#
表示注释 -
每一个指令都会创建提交一个新的镜像层,并提交!
Dockerfile指令说明:
实战测试:构建一个centos
DockerHub中99%的镜像都是以scratch
作为基础镜像创建起来的。
# 1、编写Dockerfile文件
FROM centos
MAINTAINER xingxing<nwu_qx@163.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 "----end----"
CMD /bin/bash
# 2、通过这个文件构建镜像
docker build -f dockerfile文件路径 -t 镜像:版本
# 3、测试运行
pwd
vim
ifconfig
7、发布镜像
-
发布到DockerHub
1、网站注册:https://hub.docker.com/
2、docker登陆
3、发布镜像
docker push ImageName:TAG
-
发布到阿里云容器服务
1、进入阿里云镜像服务控制台
网站:https://cr.console.aliyun.com/cn-hangzhou/instance/repositories
2、创建命名空间
3、创建镜像仓库
4、发布镜像
资料
【视频】Docker基础讲解:https://www.bilibili.com/video/BV1og4y1q7M4?p=21&spm_id_from=pageDriver