docker学习
Docker是一个开源的引擎,可以轻松的为任何应用创建一个轻量级的、可移植的、自给自足的容器。开发者在笔记本上编译测试通过的容器可以批量地在生产环境中部署,包括VMs(虚拟机)、 bare metal、OpenStack 集群和其他的基础应用平台。
镜像(image)
镜像可以理解为一个模板,里边有一些东西,可以通过run命令来进行运行。通过某一个镜像可以创建多个容器(最终的服务或者是项目就是运行在容器里边的)
容器(container)
Docker利用容器技术可以独立运行一个或者一组应用。可以通过镜像运行启动、停止、删除的基本命令
目前可以把容器理解为一个简易的Linux系统
仓库(repository)
存放镜像的地方分为公有仓库(Docker hub、腾讯云、阿里云等等)和私有仓库
公有仓库默认都是国外的,需要配置镜像加速
常用的命令
镜像命令
docker images查看本机全部镜像
[root@centoss dockertest]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE hello-world latest feb5d9fea6a5 6 months ago 13.3kB # 详细解释 REPOSITORY 镜像的仓库源 TAG 镜像的版本标签信息 IMAGE ID 镜像的ID CREATED 镜像的创建时间 SIZE 镜像的大小 # 可选项 Options: -a, --all # 列出所有的镜像 --digests # 展示digests签名信息 -q, --quiet # 只显示镜像的ID ###################################### 这下便的并不常用就不再多家解释了 -f, --filter filter Filter output based on conditions provided --format string Pretty-print images using a Go template --no-trunc Don't truncate output
docker search 搜索镜像
一个查找MySQL镜像的实例
[root@localhost muyi]# docker search mysql NAME DESCRIPTION STARS OFFICIAL AUTOMATED mysql MySQL is a widely used, open-source relation… 14048 [OK] mariadb MariaDB Server is a high performing open sou… 5367 [OK] phpmyadmin phpMyAdmin - A web interface for MySQL and M… 783 [OK] percona Percona Server is a fork of the MySQL relati… 604 [OK] bitnami/mysql Bitnami MySQL Docker Image 83 [OK] databack/mysql-backup Back up mysql databases to... anywhere! 82 linuxserver/mysql-workbench 48 ubuntu/mysql MySQL open source fast, stable, multi-thread… 45 linuxserver/mysql A Mysql container, brought to you by LinuxSe… 38 circleci/mysql MySQL is a widely used, open-source relation… 29 google/mysql MySQL server for Google Compute Engine 23 [OK] rapidfort/mysql RapidFort optimized, hardened image for MySQL 14 bitnami/mysqld-exporter 4 vitess/mysqlctld vitess/mysqlctld 1 [OK]
docker pull下载镜像
# 下载命令格式:docker pull mysql[:tag] [root@centos dockertest]# docker pull mysql Using default tag: latest # 上边没有写tag要求具体的版本号,这边的就是下载latest最新版 latest: Pulling from library/mysql f003217c5aae: Pull complete # 分层下载,docker images的核心 联合文件系统 65d94f01a09f: Pull complete 43d78aaa6078: Pull complete a0f91ffbdf69: Pull complete 59ee9e07e12f: Pull complete 04d82978082c: Pull complete 70f46ebb971a: Pull complete db6ea71d471d: Pull complete c2920c795b25: Pull complete 26c3bdf75ff5: Pull complete 9ec1f1f78b0e: Pull complete 4607fa685ac6: Pull complete Digest: sha256:1c75ba7716c6f73fc106dacedfdcf13f934ea8c161c8b3b3e4618bcd5fbcf195 # 签名信息(防伪标志) Status: Downloaded newer image for mysql:latest docker.io/library/mysql:latest # 真实地址,也就是说"docker pull mysql"和"docker pull docker.io/library/mysql:latest"是同一个意思 # 下载其他版本的话可以查官方支持的版本。然后比如说: docker pull mysql:5.7 # 下边有一张图可以看到官方提供的信息,5.7是存在的 ########################################### [root@centos dockertest]# docker pull mysql:5.7 5.7: Pulling from library/mysql f003217c5aae: Already exists # 这些东西实际上都是使用的共用的,这就是docker的联合文件系统所讲到的东西 65d94f01a09f: Already exists ······ ba61822c65c2: Pull complete ······ Digest: sha256:1a73b6a8f507639a8f91ed01ace28965f4f74bb62a9d9b9e7378d5f07fab79dc Status: Downloaded newer image for mysql:5.7 docker.io/library/mysql:5.7 ########################################### # 解释 Options: -a, --all-tags Download all tagged images in the repository --disable-content-trust Skip image verification (default true) --platform string Set platform if server is multi-platform capable -q, --quiet Suppress verbose output
docker rmi删除镜像(这边的rmi代表的是remove image)
[root@centos dockertest]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE mysql 5.7 f26e21ddd20d 2 days ago 450MB mysql latest 667ee8fb158e 2 days ago 521MB hello-world latest feb5d9fea6a5 6 months ago 13.3kB [root@centos dockertest]# docker rmi -f 667ee8fb158e Untagged: mysql:latest Untagged: mysql@sha256:1c75ba7716c6f73fc106dacedfdcf13f934ea8c161c8b3b3e4618bcd5fbcf195 Deleted: sha256:667ee8fb158e365450fc3f09712208fe44e9f1364a9b130fed95f3f4862f8a63 Deleted: sha256:daba3b5cd1b725f259d5d59049c7011f6a20f2e7e4782b873cadeedbc1a4f122 Deleted: sha256:407a68a397de3c8e4da2ccd388f27c795519414cc9319f674e7b9a492cd8514b Deleted: sha256:6967db79cb8031d7e505dd82c91c6426e84c6ad2098d06c1c090485886bc1c63 Deleted: sha256:3dcc0f922d11309b2e4870d5f42c5005f086c9b9c1e128ed2b712b65fa79a5c9 Deleted: sha256:ae5d4ab2734d5c27069212b2690dc2c7ac4cd85ee5e122607cb175f7fe908914 [root@centos dockertest]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE mysql 5.7 f26e21ddd20d 2 days ago 450MB hello-world latest feb5d9fea6a5 6 months ago 13.3kB # !!!!删除全部镜像 docker rmi -f $(docker images- aq) # 这边的$代表的是传参,执行$后边括号里边的内容并发送到前边进行执行,简单来说就是查询目前所有镜像的id并依次删除 # 解释 Options: -f, --force Force removal of the image --no-prune Do not delete untagged parents
容器命令
docker run 启动容器
命令格式:docker run [可选参数] (image) 常见参数说明: --name="NAME" # 给容器起的名字 -d # 表示以后台方式运行 -i -t -it # 使用交互方式运行,可以进入容器查看内容 -p # 指定容器的端口,可以主机映射 比如:-p 8080:8080 -p (ip:主机端口:容器端口) -p (主机端口:容器端口) # 常用 -p (容器端口) -P # 上边的是小写的p,这个是大写的,表示随机指定端口
docker ps查看所有正在运行中的容器
# 查看正在运行的容器 [root@centos dockertest]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES # 查看运行过的容器倒序输出 [root@centos dockertest]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES de33bc517d24 centos "/bin/bash" 6 minutes ago Exited (0) 2 minutes ago stupefied_rhodes 403730c6b9e3 hello-world "/hello" 2 hours ago Exited (0) 2 hours ago kind_kare d7d3f3b9bc35 hello-world "/hello" 2 hours ago Exited (0) 2 hours ago cranky_almeida # 常用选项 docker ps # 列出当前正在运行的容器 -a # 列出当前正在运行的容器以及曾经运行过的容器 -n=? # 显示最近创建的容器(传入的参数表示显示个数) -q # 只显示容器的编号(和只显示镜像编号那里(注意下))
快捷键退出容器
exit # 容器停止并退出 Crtl -P+Q # 容器不停止并退出
docker rm删除容器
docker rm (容器id) # 不能删除正在运行中的容器,如果需要删除运行中的容器需要加上-f
docker rm -f $(docker ps -aq) # 删除全部容器
docker ps -a -q|xargs docker rm # 删除全部容器
启动和停止容器docker start
docker start (容器id) # 启动容器 docker restart (容器id) # 重启容器 docker stop (容器id) # 停止容器 docker kill (容器id) # 暴力停止容器 docker attach (容器id) # 进入正在运行中的容器
其他命令
查看日志 :docker logs (容器id) 查看容器进程信息:docker top (容器id) 查看容器详细信息:docker inspect 进入当前正在运行的容器: docker exec -it docker attach 从容器拷贝文件到主机上:docker cp (容器id:容器内路径) (目的主机路径)
镜像的一些打包用法
docker commit 提交容器成为一个新的副本
docker commit -m="提交的描述信息" -a="作者" (容器id) (目标镜像名)[:TAG]
这就相当于自己打包了镜像(也可以理解为给容器打了一个快照)
容器数据卷
容器之间有一个数据共享的技术。Docker容器中产生的数据同步到本地。这就是卷技术。
是为了容器的持久化和持续操作。容器之间也是可以数据互享的。
方法一:使用命令来挂载 -v
docker run -it -v (主机目录:容器内目录)
[root@centos dockertest]# cd /test/
[root@centos test]# ls
[root@centos test]# touch testfile
[root@centos test]# cd -
/root/dockertest
[root@centos dockertest]# docker run -it -v /test:/home centos /bin/bash
[root@a7e0491886d9 /]# cd /home
[root@a7e0491886d9 home]# ls
testfile
[root@a7e0491886d9 home]# touch 222
[root@a7e0491886d9 home]# exit
[root@centos dockertest]# ls /test
222 testfile
只要容器不删,哪怕容器是停机装填,他就会一直保持数据卷挂载的同步状态
方法二:具名和匿名挂载
docker volume命令
-v 容器内路径 # 匿名挂载
-v 卷名:容器内路径 # 具名挂载
-v 容器外路径:容器内路径 # 指定路径挂载
[root@centos txl]# docker inspect 250bdae058d4
···
"Mounts": [
{
"Type": "volume",
"Name": "7372e6be2a993e3cff79846371ef90e1e7ddd209a9c0dff7bcaaba272b38fe9c",
"Source": "/var/lib/docker/volumes/7372e6be2a993e3cff79846371ef90e1e7ddd209a9c0dff7bcaaba272b38fe9c/_data",
"Destination": "VOLUME01",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
},
{
"Type": "volume",
"Name": "4cb2f082d81143929600c1870f9a51f85802671eaf61a0d33d0e6f469eca65f4",
"Source": "/var/lib/docker/volumes/4cb2f082d81143929600c1870f9a51f85802671eaf61a0d33d0e6f469eca65f4/_data",
"Destination": "VOLUME02",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
],
方法三:dockerfile
[root@centos dockertest]# ls
dockerfile testfile
[root@centos dockertest]# vim dockerfile
[root@centos dockertest]# cat dockerfile
FROM centos
VOLUME ["VOLUME01","VOLUME02"]
CMD echo "-----END------"
CMD /bin/bash
[root@centos dockertest]# docker build -f dockerfile -t txl/centos:1.0 .
Sending build context to Docker daemon 3.072kB
Step 1/4 : FROM centos
---> 5d0da3dc9764
Step 2/4 : VOLUME ["VOLUME01","VOLUME02"]
---> Running in e01b0997d34a
Removing intermediate container e01b0997d34a
---> e5476437958b
Step 3/4 : CMD echo "-----END------"
---> Running in a0d34e70e0fe
Removing intermediate container a0d34e70e0fe
---> 45a3c6498922
Step 4/4 : CMD /bin/bash
---> Running in 2baca78f3a23
Removing intermediate container 2baca78f3a23
---> 27760c78f582
Successfully built 27760c78f582
Successfully tagged txl/centos:1.0
[root@centos dockertest]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
txl/centos 1.0 27760c78f582 59 seconds ago 231MB
通过上边的文件成功创建出了txl/centos:1.0镜像,这是dockerfile的文件内容
# 所有指令全部大写
FROM centos # 给予Centos
VOLUME ["VOLUME01","VOLUME02"] # 挂载磁盘
CMD echo "-----END------" # 输出end
CMD /bin/bash # 使用/bin/bash终端
# 这里的每个命令,都是镜像的一层
数据卷容器
--volumes-from表示跟随某个容器挂载的目录
首先创建两个容器docker01和docker02,并要求docker02的使用docker01创建的卷
[root@centos _data]# docker run -dit --name docker01 txl/centos:1.0
8e809b855b362dff150aa2c244f0036d48c0bcd51cbdb89fa62ab25b731f2ae9
[root@VM-20-15-centos _data]# docker run -itd --name docker02 --volumes-from docker01 txl/centos:1.0
c63f3797c7ba9df3ad8955ac81c65222f69e6279e54e2a37d30a97e5f174009e
docker01中的处理
[root@centos dockertest]# docker attach docker01
[root@8e809b855b36 /]# ls
VOLUME01 VOLUME02 bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
[root@8e809b855b36 /]# cd VOLUME01/
[root@8e809b855b36 VOLUME01]# ls
[root@8e809b855b36 VOLUME01]# touch 1contain.txt
[root@8e809b855b36 VOLUME01]# ls
1contain.txt
这里是docker02
[root@Vcentos dockertest]# docker attach docker02
[root@c63f3797c7ba /]# ls
VOLUME01 VOLUME02 bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
[root@c63f3797c7ba /]# cd VOLUME01/
[root@c63f3797c7ba VOLUME01]# ls
[root@c63f3797c7ba VOLUME01]# ls
1contain.txt
最终发现,只要容器和容器之间的卷连接了起来,只要其中一个容器的卷还没有丢,那公有数据就丢不了
Dockerfile
docker镜像的构建文件就是dockerfile,是一个命令参数脚本
构建过程
每个保留关键字(指令)都必须是大写字母
执行顺序从上到下
·#·表示注释
每一个指令都会创建提交到一个新的镜像层,并提交
dockerfile是面向开发的,发布项目,做镜像,都需要编写dockerfile文件
dockerfile指令
FROM:基础镜像(官方的基础镜像一般基础scatch镜像)
MAINTAINER:镜像作者||维护者信息(一般是姓名+邮箱)
RUN:镜像构建的时候需要运行的命令
ADD:步骤(比如说tomcat镜像,就需要加上去拷贝并解压tomcat压缩包的步骤)
WORKDIR:镜像的工作目录。可以自己定义
VOLUME:挂载到某个容器卷
EXPOSE:规定对外开放的端口
CMD:指定这个容器启动的时候需要运行的命令,只有最后一个会生效,可被替代(可以被docker run -l 的形式替代掉)
ENTRYPOINT:指定这个容器启动的时候需要运行的命令,可以追加命令(可以使用docker run -l 的形式追加命令)
ONBUILD:当构建一个被继承的Dockerfile的时候就会执行这里的命令。是一个触发命令
COPY:类似ADD,将我们的文件拷贝到镜像中
ENV:构建的时候设置环境变量
手写一个dockerfile
FROM centos
# 基于centos基础镜像
MAINTAINER xiaolongtongxue<13350581502@qq.com>
# 开发人员信息(邮箱写错了...)
ENV MYPATH /usr/local
# 定义环境变量MYPATH
WORKDIR $MYPATH
# 定义工作目录
RUN yum -y install vim
# 运行命令使用yum安装vim和net-tools
RUN yum -y install net-tools
EXPOSE 80
# 暴露80端口
# 输出
CMD echo $MYPATH
CMD echo "------end-------"
CMD /bin/bash
# 使用/bin/bash终端
docker build构建镜像mycentos:0.1
[root@centos dockerfile]# docker build -f mydockerfile1 -t mycentos:0.1 .
[root@centos dockerfile]# docker run -it mycentos:0.1 /bin/bash
CMD命令和ENTRYPOINT命令
CMD命令的结果可以被传入的命令替代掉
entrypoint是允许在后边添加补充命令的,但是cmd的话就是直接覆盖