docker基础命令、数据卷、dockerfile

一、Docker简介

虚拟机属于虚拟化技术。Docker容器技术,也是一种虚拟化技术!
Vm: linux Centos原生镜像(一个电脑),隔离的话需要很多虚拟机! 几个G 几分钟
Docker: 隔离,镜像(只有最核心的环境4m+jdk+mysql)十分的小巧,运行镜像就可以了 几个M 甚至KB 秒级启动
官网:https://www.docker.com/
官网文档手册:https://docs.docker.com/ 超级详细!
仓库地址:https://hub.docker.com/

比较Docker和虚拟机的不同:
1、传统虚拟机。虚拟出一条硬件,运行一个完整的操作系统,然后在这个系统上安装和运行。
2、容器内的应用直接运行在宿主的内核,容器是没有自己的内核的,也没有虚拟我们的硬件,所以就很轻便了。
3、每个容器间都是互相隔离,每个容器内都有一个属于自己的文件系统,互不影响。

好处:
1.应用更快速的交付和部署
传统:一堆帮助文档,安装程序
Docker:打包镜像打不测试,一键运行
2.更便捷的升级和扩缩容
使用了Docker之后,我们部署应用就和搭积木一样!
3.更简单的系统运维
在容器化之后,我们的开发,测试环境都是高度一致的。
4.更高效的计算资源利用
1核两G的服务器,现在可以装几十个tomcat
Docker是内核级别的虚拟化,可以再一个物理机上运行很多实例!服务器的性能可以被压缩到极致!

二、Docker组成
Docker的基本组成

镜像(image)
Docker镜像就好比是一个模板,可以通过这个模板来创建容器服务 tomcat镜像==>run==>tomcat01容器(提供服务器),通过这个镜像可以创建出很多个容器(最终服务运行或者项目运行都是在容器会中的)。
容器(container)
Docker利用容器技术,独立运行一个或者一组应用,通过镜像来创建的。
可以通过命令来启动,停止,删除基本命令。
目前就可以吧这个容器理解为一个简易的linux系统
仓库(repository)
仓库就是存放镜像的地方。分为共有仓库和私有仓库
Docker Hub(默认是国外的) 阿里云、华为云都有容器服务器(配置镜像加速)
三、Docker安装
1、卸载已有Docker
$ sudo yum remove docker
docker-client
docker-client-latest
docker-common
docker-latest
docker-latest-logrotate
docker-logrotate
docker-engine
2、下载需要的安装包
$ sudo yum install -y yum-utils
3、配置仓库镜像(默认国外)
$ sudo yum-config-manager
–add-repo
https://download.docker.com/linux/centos/docker-ce.repo

$ sudo yum-config-manager
–add-repo
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
建议更新yum软件包索引
yum makecache fast
4、安装Docker相关 Docker-ce社区 ee企业
$ sudo yum install docker-ce docker-ce-cli containerd.io
5、启动Docker
$ sudo systemctl start docker
验证: docker version

6、测试
$ sudo docker run hello-world

7、查看镜像:docker images
8、了解卸载Docker
卸载依赖
$ sudo yum remove docker-ce docker-ce-cli containerd.io
删除资源
$ sudo rm -rf /var/lib/docker
/var/lib/docker的默认工作路径
四、回顾helloword流程
Run的运行流程图:

底层原理:
Docker为什么比VM快
1、Docker有着比虚拟机更少的抽象层
2、Docker利用的是宿主机的内核,vm需要的是GuestOS。

五、Docker的基本命令
1.帮助命令
启动docker命令:systemctl start docker
docker version #显示docker版本信息
docker info #显示docker更详细的系统信息,包括镜像和容器的数量
docker 命令 --help #帮助命令
2.镜像命令
docker images 或者docker image ls查看所有本地的主机上的镜像
[root@bogon docker]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest bf756fb1ae65 13 months ago 13.3kB
#解释
REPOSITORY 镜像的仓库源
TAG 镜像的标签
IMAGE ID 镜像的ID
CREATED 镜像的创建时间
SIZE 镜像的大小
#可选项
-a, --all #列出所有镜像
-q, --quiet #只显示镜像的ID
docker pull下载镜像
#下载镜像docker pull 镜像名[:tag]
[root@bogon docker]# docker pull mysql #不指定默认是latest
[root@bogon docker]# docker pull mysql:5.7

Docker rmi 或者 docker image rm 镜像名或镜像id 删除镜像
[root@bogon docker]# docker rmi -f 镜像id #删除指定镜像
[root@bogon docker]# docker rmi -f 镜像id 镜像id 镜像id #删除多个镜像
[root@bogon docker]# docker rmi -f $(docker images -aq) #删除全部镜像 $()作用是将()里的作为参数传进去

3.容器命令
说明:我们有了镜像才可以创建容器,linux,下载一个centos镜像来测试学习
docker pull centos
[root@bogon docker]# docker pull centos
Using default tag: latest
latest: Pulling from library/centos
7a0437f04f83: Pull complete
Digest: sha256:5528e8b1b1719d34604c87e11dcd1c0a20bedf46e83b5632cdeac91b8c04efc1
Status: Downloaded newer image for centos:latest
docker.io/library/centos:latest #真实地址
新建容器并启动
Docker run [可选参数] image
#参数说明
–name=”Name” 指定容器的名字 tomcat01 tomcat02 用来区分容器
-d 后台方式运行
-it 使用交互方式运行,进入容器查看内容
-p 指定容器的端口 -p 8080:8080
-P 随机指定端口
#测试,启动并进入容器
[root@bogon docker]# docker run -it centos /bin/bash
[root@2a1c7ac7cf4d /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
#从容器中返回主机
[root@2a1c7ac7cf4d /]# exit
exit
[root@bogon docker]# ls
buildkit containers image network overlay2 plugins runtimes swarm tmp trust volumes
退出容器
exit #直接停止并退出容器
Ctrl+p+Q #容器不停止退出
删除容器
[root@bogon docker]# docker rm 容器id #删除指定的容器,不能删除正在运行的容器,如果要删除用rm -f强制
[root@bogon docker]# docker rm -f $(docker ps -qa) #删除所有的容器
[root@bogon docker]# docker ps -a -q|xargs docker rm #删除所有容器
启动和停止容器
[root@bogon docker]# docker ps -a #查看容器id
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2a1c7ac7cf4d centos “/bin/bash”
docker start 容器id
docker restart 容器id
docker stop 容器id
docker kill 容器id
4.常用其他命令
后台启动程序
#命令docker run -d 镜像名!
查看日志
docker logs -f -t --tail 10 容器id
#自己写一段shell脚本
[root@192 ~]# docker run -d centos /bin/sh -c “while true;do echo lihao;sleep 1;done”
[root@192 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
783a437e91ec centos “/bin/sh -c 'while t…” 10 seconds ago Up 6 seconds laughing_moore
[root@192 ~]# docker logs -f -t --tail 10 783a437e91ec #-tf显示日志 --tail 数字显示几条
2021-02-18T14:13:00.718976738Z lihao
2021-02-18T14:13:01.722222430Z lihao
2021-02-18T14:13:02.725460454Z lihao
2021-02-18T14:13:03.728221043Z lihao
2021-02-18T14:13:04.731862080Z lihao
2021-02-18T14:13:05.735406243Z lihao
2021-02-18T14:13:06.738527059Z lihao
2021-02-18T14:13:07.742914207Z lihao

查看容器中进程信息
[root@bogon docker]# docker top 2a1c7ac7cf4d
UID PID PPID C STIME TTY TIME CMD
root 17046 17025 0 17:49 pts/0 00:00:00 /bin/bash
后台启动容器
#命令docker run -d 镜像名
[root@192 ~]# docker run -d centos #有个问题发现刚启动就停止了!!!!!!!
#常见的坑:docker容器使用后台运行的话,必须要有一个前台进程,docker发现米有应用,就会自动停止
#nginx,容器启动后,发现自己没有提供服务,就会立刻停止,就是没有程序了

查看镜像的元数据
Docker inspect 容器id
[root@bogon ~]# docker inspect 783a437e91ec
进入当前正在运行的容器
#我们通常容器都是使用后台方式运行的,需要进入容器,修改一些配置
#命令
[root@bogon ~]# docker exec -it 容器id /bin/bash #方式一 进入容器后开启一个新的终端,可以在里面操作(常用)
[root@bogon ~]# docker attach 容器id #方式二 进入正在执行的终端,不会启动新的进程从容器

从容器内拷贝文件到主机上

#进入正在执行的容器内部
[root@bogon ~]# docker attach 0f25275c5837
#查看目录
[root@0f25275c5837 /]# ls
bin etc lib lost+found mnt proc run srv tmp var
dev home lib64 media opt root sbin sys usr
#到home目录创建文件
[root@0f25275c5837 /]# cd /home
[root@0f25275c5837 home]# ls
[root@0f25275c5837 home]# touch test.java
[root@0f25275c5837 home]# ls
test.java
#查看容器id
[root@bogon ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0f25275c5837 centos “/bin/bash” 3 minutes ago Up 3 minutes frosty_thompson
#从容器拷贝文件到主机
[root@bogon ~]# docker cp 0f25275c5837:/home/test.java /home
#到home目录查看文件
[root@bogon ~]# cd /home
[root@bogon home]# ll
总用量 0
-rw-r–r--. 1 root root 0 2月 19 10:01 test.java

######拷贝是一个手动过程,未来我们使用 -v 卷的技术,可以实现 容器/home 主机/home连通
方便命令查看

六、作业:部署nginx
#1、搜索镜像 search 建议去docker搜索,可以看到帮助文档
Docker search nginx
#2、下载镜像 pull
Docker pull nginx
#3、运行
[root@bogon ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 35c43ace9216 31 hours ago 133MB
centos latest 300e315adb2f 2 months ago 209MB

-p 宿主机端口:容器内部端口

[root@bogon ~]# docker run -d --name nginx01 -p 3344:80 nginx
9eb6b93ff272a48da5e8a5ecf446cfeb4192f36d1b2a63f54b13111db31575bb
[root@bogon ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9eb6b93ff272 nginx “/docker-entrypoint.…” 10 seconds ago Up 5 seconds 0.0.0.0:3344->80/tcp nginx01
#4、测试端口
[root@bogon ~]# curl localhost:3344

Welcome to nginx!

Welcome to nginx!

If you see this page, the nginx web server is successfully installed and working. Further configuration is required.

For online documentation and support please refer to nginx.org.
Commercial support is available at nginx.com.

Thank you for using nginx.

进入容器
[root@bogon ~]# docker exec -it nginx01 /bin/bash
root@9eb6b93ff272:/# whereis nginx
nginx: /usr/sbin/nginx /usr/lib/nginx /etc/nginx /usr/share/nginx
root@9eb6b93ff272:/# cd /etc/nginx/
root@9eb6b93ff272:/etc/nginx# ls
conf.d koi-utf mime.types nginx.conf uwsgi_params
fastcgi_params koi-win modules scgi_params win-utf

七、Commit镜像
##########Docker commit 提交容器成为一个新的副本,保存当前状态,就像游戏存档,把多层变成一层(centos+创建文件=centos01),也像虚拟机的快照
[root@bogon ~]# docker commit -a=“作者” -m=‘提交的描述信息’ 04a30c12bde8 centos01:1.0
实战测试
[root@bogon ~]# docker run -it centos
[root@cd342d4eee27 /]# ls
bin etc lib lost+found mnt proc run srv tmp var
dev home lib64 media opt root sbin sys usr
[root@cd342d4eee27 /]# cd opt
[root@cd342d4eee27 opt]# ls
[root@cd342d4eee27 opt]# vi test
[root@cd342d4eee27 opt]# [root@bogon ~]#
[root@bogon ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
cd342d4eee27 centos “/bin/bash” About a minute ago Up About a minute exciting_bardeen
[root@bogon ~]# docker commit -a=“lihao” -m=“vi test” cd342d4eee27 centos02:1.0
sha256:d256e2904f5d590cbf3bdde7c09d082bfab5286f9c421b94a7e4a62ddca1c092
[root@bogon ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos02 1.0 d256e2904f5d 8 seconds ago 209MB
nginx latest 35c43ace9216 38 hours ago 133MB
centos latest 300e315adb2f 2 months ago 209MB
portainer/portainer latest 62771b0b9b09 7 months ago 79.1MB
八、容器数据卷
什么是容器数据卷?
Docker的理念是将应用和环境打包成一个镜像!
如果数据都在容器中,那么我们删除容器数据就会丢失!需求:数据可以持久化
MySQL,容器删除了,里面数据没了等于删库跑路!需求:MySQL数据可以存储在本地
容器之间可以有一个数据共享的技术,docker容器中产生的数据,同步到本地。
就是卷技术!!!本质是目录的挂载,将我们的容器内的目录,挂载到linux上面。
可以理解为同步技术

总结:容器数据的持久化和同步操作。容器间也是可以共享的。
1.使用数据卷
方式一:
docker run -it -v 主机目录:容器内目录
[root@localhost home]# docker run -it -v /home/lihao:/home centos /bin/bash
#启动起来之后,可以用docker inspect 容器id 来查看挂载情况

测试:
#在容器内部创建一个文件
[root@60ec9362344d /]# cd home
[root@60ec9362344d home]# vi test.java
#查看本地本地
[root@localhost lihao]# ll
-rw-r–r--. 1 root root 16 2月 20 10:12 test.java
####即使容器关闭后,在本地添加文件,也可以同步过去
挂载之后,目录就是同步的,双向绑定,和容器开启关闭无关
2.实战:安装MySQL同步数据(容器数据同步到宿主机)
[root@localhost home]# docker search mysql
[root@localhost home]# docker pull mysql:5.7
#官方测试
docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:5.7
#启动我们的
-d 后台运行
-p 端口映射
-v 卷挂载
-e 环境配置
–name 容器名字
[root@localhost docker]# docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysq l:5.7
#测试用SQLyog链接
#链接上之后再sqlyog创建数据库,在本地就会同步
#同步之后删除容器,已经同步的本地数据不会丢失,实现了数据持久化
具名和匿名挂载
#匿名挂载
-v 容器内路径
-P 随机映射端口号
[root@localhost docker]# docker run -d -P --name nginx01 -v /etc/nginx nginx#这里发现,我们在-v只写了容器内的路径,没有写容器外的路径!
#查看所有的volume的情况
[root@localhost docker]# docker volume ls
DRIVER VOLUME NAME
local 0e70c448ffc1833fa2c888285398c8bc7d7d209447d217321df7db8f2b25121e
local 0f564fcb3bbf1e1ece505bbbb4c014de5e28e4b2e7a2c57362bb7c4c324ce1a0
#具名挂载
[root@localhost docker]# docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx
[root@localhost docker]# docker volume ls
DRIVER VOLUME NAME
local dbf61340876e16e29baa85a153c4d0226a0544c94aa749013e1927fd1b83aaf4
local juming-nginx
#查看具名挂载的具体信息
[root@localhost docker]# docker volume inspect juming-nginx
[
{
“CreatedAt”: “2021-02-20T14:35:08+08:00”,
“Driver”: “local”,
“Labels”: null,
“Mountpoint”: “/var/lib/docker/volumes/juming-nginx/_data”, ###挂载的路径
“Name”: “juming-nginx”,
“Options”: null,
“Scope”: “local”
}
]
所有的docker容器内的卷,没有指定目录的情况下都是在 /var/lib/docker/volumes/xxx下
挂载方式:
-v 容器内路径 #匿名挂载
-v 卷名:容器内路径 #具名挂载
-v /主机路径:容器内路径 #指定路径挂载
拓展:
ro readonly #只读
rw readwrite #可读可写
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:ro nginx
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:rw nginx
###只要看到ro就说明这个路径只能通过宿主机来操作,容器内部是无法操作!
第二种方法,初识dockerfile
#创建自己的一个镜像,创建时候挂载卷
#创建一个文件,根据这个文件创建镜像,就是写一个脚本,指令(都是大写)参数
#这里的每个命令,就是镜像的一层
[root@localhost home]# cat dockerfile
FROM centos
VOLUME [“volume01”,“volume02”]
CMD echo"—end—"
CMD /bin/bash
#创建自己的镜像
[root@localhost home]# docker build -f /home/dockerfile -t lihao/centos:1.0 .
Sending build context to Docker daemon 207.2MB
Step 1/4 : FROM centos
—> 300e315adb2f
Step 2/4 : VOLUME [“volume01”,“volume02”]
—> Running in ba3c9406e5ea
Removing intermediate container ba3c9406e5ea
—> 073faf58b727
Step 3/4 : CMD echo"—end—"
—> Running in a65d7b6a3486
Removing intermediate container a65d7b6a3486
—> e335c703567e
Step 4/4 : CMD /bin/bash
—> Running in e4b4621163b7
Removing intermediate container e4b4621163b7
—> 34fdc8418b44
Successfully built 34fdc8418b44
Successfully tagged lihao/centos:1.0
#创建成功查看镜像
[root@localhost home]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
lihao/centos 1.0 34fdc8418b44 32 seconds ago 209MB
#进入容器
[root@localhost home]# docker run -it 34fdc8418b44 /bin/bash

[root@249447a64ece /]# cd volume01
[root@249447a64ece volume01]# touch container.txt
#这个目录就是我们生成镜像时候挂载的
[root@localhost volumes]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
249447a64ece 34fdc8418b44 “/bin/bash” 9 minutes ago Up 9 minutes modest_bouman
[root@localhost volumes]# docker inspect 249447a64ece

[root@localhost _data]# pwd
/var/lib/docker/volumes/9f4a1c608dd2401e55bb47b50e63e8163154fa723306085a33adb50de6d4ddc9/_data
[root@localhost _data]# ll
-rw-r–r--. 1 root root 0 2月 20 16:14 container.txt
#实验成功!主机有这个目录有这个文件
3.容器之间挂载卷(备份)
#开启容器1
[root@bogon ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
lihao/centos 1.0 34fdc8418b44 47 hours ago 209MB
nginx latest 35c43ace9216 4 days ago 133MB
mysql 5.7 5f47254ca581 13 days ago 449MB
tomcat latest 040bdb29ab37 5 weeks ago 649MB
centos latest 300e315adb2f 2 months ago 209MB
portainer/portainer latest 62771b0b9b09 7 months ago 79.1MB
[root@bogon ~]# docker run -it --name centos01 lihao/centos:1.0 /bin/bash
[root@6a006d008b26 /]# ls
bin etc lib lost+found mnt proc run srv tmp var volume02
dev home lib64 media opt root sbin sys usr volume01
[root@6a006d008b26 /]# cd volume01
[root@6a006d008b26 volume01]# ls
[root@6a006d008b26 volume01]#
#开启容器2,并挂载容器1
[root@bogon ~]# docker run -it --name centos02 --volumes-from centos01 lihao/centos:1.0
[root@b82a1b3725f8 /]# ls
bin etc lib lost+found mnt proc run srv tmp var volume02
dev home lib64 media opt root sbin sys usr volume01
[root@b82a1b3725f8 /]# cd volume01
[root@b82a1b3725f8 volume01]# ls
[root@b82a1b3725f8 volume01]#
#在容器1中创建个文件
[root@6a006d008b26 volume01]# touch test.txt
[root@6a006d008b26 volume01]# ls
test.txt
#在容器2中查看
[root@b82a1b3725f8 volume01]# ls
test.txt
#查看容器1的挂载信息
[root@bogon ~]# docker inspect 6a006d008b26

#在本地查看对应目录
[root@bogon ~]# cd /var/lib/docker/volumes/3cc8be9f5d604359d2082cc36ff1f274c60a3ab61e1487a7809410306971cc0d/_data
[root@bogon _data]# ls
test.txt
#####经测试容器1、容器2、本地都是互相通的,数据同步,备份,共享
#####结论容器之间信息的传递,数据卷容器的生命周期一直持续到没有容器使用为止,如果2没了1、3还能同步
,但是一旦持久化到了本地,这个时候本地的数据是不会删除的。
九、DockerFile
DockerFile是用来构建docker镜像的文件!命令参数脚本!
构建步骤:
1、编写一个dockerFile文件
2、Docker build 构建成为一个镜像
3、Docker run运行镜像
4、Dicker push 发布镜像(dockerHub、阿里云镜像仓库)

1.DockerFile的指令
FROM #基础镜像,一切从这里开始构建
MAINTAINER #镜像是谁写的,姓名+邮箱
RUN #镜像构建的时候需要运行的命令
ADD #步骤,tomcat镜像,这个tomcat压缩包,添加内容
WORKDIR #镜像的工作目录
VOLUME #挂载的目录
EXPOST #保留端口配置
CMD #指定这个容器启动时候要运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT #指定这个容器启动时候要运行的命令,可以追加命令
ONBUILD #当构建一个被继承DockerFile的时候就会运行,触发指令
COPY #类似ADD,将我们文件拷贝到镜像中
ENV #构建的时候设置环境变量
2.创建一个自己的centos
#1、编写dockerFile的文件
[root@bogon dockerfile]# vi dockerfile-centos
[root@bogon dockerfile]# cat dockerfile-centos
FROM centos # 基础镜像
MAINTAINER lihao<1273844544> # 运维人员

ENV MYPATH /usr/local # 配置环境变量
WORKDIR $MYPATH # 配置默认的工作目录

RUN yum -y install vim # 下载vim
RUN yum -y install net-tools # 下载ifconfig

EXPOSE 80 # 暴漏端口

CMD echo $MYPATH # 输出
CMD echo “—end----”
CMD /bin/bash
#2、通过这个文件构建镜像
[root@bogon dockerfile]# docker build -f dockerfile-centos -t mycentos:1.0 .
Successfully built 016fb8a2a859
Successfully tagged mycentos:1.0
#3、进入容器,查看变化
[root@bogon dockerfile]# docker run -it mycentos:1.0
[root@4b5ab299c761 local]# ls
bin etc games include lib lib64 libexec sbin share src
[root@4b5ab299c761 local]# pwd #工作目录
/usr/local
[root@4b5ab299c761 local]# ifconfig #新添加的命令
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.17.0.4 netmask 255.255.0.0 broadcast 172.17.255.255
ether 02:42:ac:11:00:04 txqueuelen 0 (Ethernet)
RX packets 8 bytes 656 (656.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
loop txqueuelen 1000 (Local Loopback)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
我们可以列出本地进行的变更历史
[root@bogon dockerfile]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mycentos 1.0 016fb8a2a859 5 minutes ago 291MB
[root@bogon dockerfile]# docker history 016fb8a2a859
IMAGE CREATED CREATED BY SIZE COMMENT
016fb8a2a859 5 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" “-c” “/bin… 0B
5a5ed2ac6e18 5 minutes ago /bin/sh -c #(nop) CMD [”/bin/sh" “-c” “echo… 0B
df09d0ab8fdd 5 minutes ago /bin/sh -c #(nop) CMD [”/bin/sh" “-c” “echo… 0B
c2f2b799fb90 5 minutes ago /bin/sh -c #(nop) EXPOSE 80 0B
2da3fb800486 5 minutes ago /bin/sh -c yum -y install net-tools 23.3MB
b8072df685b6 6 minutes ago /bin/sh -c yum -y install vim 58MB
8951d6c3aae6 9 minutes ago /bin/sh -c #(nop) WORKDIR /usr/local 0B
884d2e6abc31 9 minutes ago /bin/sh -c #(nop) ENV MYPATH=/usr/local 0B
ce402ca68863 9 minutes ago /bin/sh -c #(nop) MAINTAINER lihao<12738445… 0B
300e315adb2f 2 months ago /bin/sh -c #(nop) CMD [”/bin/bash"] 0B
2 months ago /bin/sh -c #(nop) LABEL org.label-schema.sc… 0B
2 months ago /bin/sh -c #(nop) ADD file:bd7a2aed6ede423b7… 209MB

CMD和ENTRYPOINT (entrypoint)的区别
CMD #指定这个容器启动时候要运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT #指定这个容器启动时候要运行的命令,可以追加命令
测试CMD
#编写dockerfile文件
[root@bogon dockerfile]# vi dockerfile-cmd
[root@bogon dockerfile]# cat dockerfile-cmd
FROM centos
CMD [“ls”,"-a"]
#构建镜像
[root@bogon dockerfile]# docker build -f dockerfile-cmd -t cmdtest .
Sending build context to Docker daemon 3.072kB
Step 1/2 : FROM centos
—> 300e315adb2f
Step 2/2 : CMD [“ls”,"-a"]
—> Running in 2481c6f48e78
Removing intermediate container 2481c6f48e78
—> a8dd4faa2514
Successfully built a8dd4faa2514
Successfully tagged cmdtest:latest
#运行容器
[root@bogon dockerfile]# docker run cmdtest
.

.dockerenv
bin
dev
etc
home
lib
[root@bogon dockerfile]# docker run cmdtest -l
docker: Error response from daemon: OCI runtime create failed: container_linux.go:370: starting container process caused: exec: “-l”: executable file not found in $PATH: unknown.
ERRO[0007] error waiting for container: context canceled
[root@bogon dockerfile]# docker run cmdtest ls -l
total 0
lrwxrwxrwx. 1 root root 7 Nov 3 15:22 bin -> usr/bin
drwxr-xr-x. 5 root root 340 Feb 25 01:55 dev
drwxr-xr-x. 1 root root 66 Feb 25 01:55 etc
drwxr-xr-x. 2 root root 6 Nov 3 15:22 home
测试entrypoint
[root@bogon dockerfile]# vi dockerfile-entrypoint
FROM centos
ENTRYPOINT [“ls”,"-a"]

[root@bogon dockerfile]# docker build -f dockerfile-entrypoint -t entrypoint-test .
Sending build context to Docker daemon 4.096kB
Step 1/2 : FROM centos
—> 300e315adb2f
Step 2/2 : ENTRYPOINT [“ls”,"-a"]
—> Running in fd27ad18231a
Removing intermediate container fd27ad18231a
—> c86607324e8e
Successfully built c86607324e8e
Successfully tagged entrypoint-test:latest
[root@bogon dockerfile]# docker run c86607324e8e
.

.dockerenv
bin
dev
etc
home
lib
[root@bogon dockerfile]# docker run c86607324e8e -l
total 0
drwxr-xr-x. 1 root root 6 Feb 25 02:03 .
drwxr-xr-x. 1 root root 6 Feb 25 02:03 …
-rwxr-xr-x. 1 root root 0 Feb 25 02:03 .dockerenv
lrwxrwxrwx. 1 root root 7 Nov 3 15:22 bin -> usr/bin
drwxr-xr-x. 5 root root 340 Feb 25 02:03 dev
drwxr-xr-x. 1 root root 66 Feb 25 02:03 etc
drwxr-xr-x. 2 root root 6 Nov 3 15:22 home
总结:cmd会覆盖,Entrypoint会追加

3.实战:编写tomcat镜像
1、准备镜像文件、tomcat压缩包、jdk压缩包
2、编写Dockerfile文件
[root@bogon lihao]# vi Dockerfile
[root@bogon lihao]# cat Dockerfile
FROM centos
MAINTAINER lihao

COPY readme.txt /usr/local/readme.txt

ADD apache-tomcat-9.0.43.tar.gz /usr/local/
ADD jdk-8u181-linux-x64.tar.gz /usr/local/

RUN yum -y install vim

ENV MYPATH /usr/local
WORKDIR $MYPATH

ENV JAVA_HOME /usr/local/jdk1.8.0_181
ENV CLASSPATH J A V A H O M E / l i b / d t . j a r : JAVA_HOME/lib/dt.jar: JAVAHOME/lib/dt.jar:JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.43
ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.43
ENV PATH P A T H : PATH: PATH:JAVA_HOME/bin: C A T A L I N A H O M E / l i b : CATALINA_HOME/lib: CATALINAHOME/lib:CATALINA_HOME/bin

EXPOSE 8080

CMD /usr/local/apache-tomcat-9.0.43/bin/startup.sh && tail -F /url/local/apache-tomcat-9.0.43/bin/logs/catalina.out
3、构建镜像
[root@bogon lihao]# docker build -t diytomcat .
Successfully built 2f0b18d8dd71
Successfully tagged diytomcat:latest
[root@bogon lihao]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
diytomcat latest 2f0b18d8dd71 About a minute ago 665MB
4、启动镜像
[root@bogon lihao]# docker run -d -p 7070:8080 --name lihaotomcat4 -v /home/lihao/build/tomcat/test:/usr/local/apache-tomcat-9.0.43/webapps/test -v /home/lihao/build/tomcat/logs:/usr/local/apache-tomcat-9.0.43/logs diytomcat
5、访问测试
[root@bogon lihao]# docker exec -it f879b91d1b8542d9affe5d8f /bin/bash
[root@f879b91d1b85 local]# ls
apache-tomcat-9.0.43 etc include lib libexec sbin src
bin games jdk1.8.0_181 lib64 readme.txt share
#在外面测试
[root@bogon logs]# curl localhost:7070
6、发布项目(由于做了卷挂载,我们直接在本地编写项目就可以发布了)
在本地编写
[root@bogon WEB-INF]# pwd
/home/lihao/build/tomcat/test/WEB-INF
[root@bogon WEB-INF]# ls
index.jsp web.xml
[root@bogon WEB-INF]# cat index.jsp
<%@ page language=“java” contentType=“text/html; charset=UTF-8”
pageEncoding=“UTF-8”%>

hello lihao Hello World!
<% System.out.println("----my test web logs----") %> [root@bogon WEB-INF]# cat web.xml <?xml version="1.0" encoding="UTF-8"?> 测试成功! 4.发布自己的镜像 #登录docker仓库 [root@bogon ~]# docker login -u lihao318 -p lihao0318.000 WARNING! Using --password via the CLI is insecure. Use --password-stdin. WARNING! Your password will be stored unencrypted in /root/.docker/config.json. Configure a credential helper to remove this warning. See https://docs.docker.com/engine/reference/commandline/login/#credentials-store Login Succeeded #登录完毕后就可以提交镜像了docker push Docker小节

十、Docker网络
1.理解docker0
[root@192 /]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever ######本机回环地址
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:b4:9f:72 brd ff:ff:ff:ff:ff:ff
inet 192.168.60.174/24 brd 192.168.60.255 scope global noprefixroute ens33
valid_lft forever preferred_lft forever #####虚拟机地址
inet6 fe80::bd6d:cef6:a85e:1b04/64 scope link noprefixroute
valid_lft forever preferred_lft forever
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
link/ether 02:42:15:f4:65:36 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever ####docker0地址
inet6 fe80::42:15ff:fef4:6536/64 scope link
valid_lft forever preferred_lft forever
问题:docker是如何处理容器网络访问的?

[root@192 /]# docker run -d -P --name tomcat01 tomcat
[root@192 /]# docker exec -it tomcat01 ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
100: eth0@if101: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
###测试liunx虚拟机能不能ping通容器?
可以ping通,因为在一个网段
###原理
我们每启动一个docker容器,docker就会给容器分配一个ip,我们只要安装了docker,就会有一个网卡docker0桥接模式,使用的技术是evth-pair技术!
#再次测试ip addr
#再次启动一个容器
[root@192 /]# docker run -d -P --name tomcat02 tomcat
#测试ip addr

发现又多了一对网卡,并且就是新增加容器的网卡
tomcat01可以ping通tomcat02,是共用的一个路由器docker0
不是直接连通,是通过本地虚拟机连接
所有的容器不指定网络的情况下,都是docker0路由的,docker会给我们的容器分配一个默认的可用ip,大约能分配65535个,都是虚拟网卡,删除容器自动消失

2.容器互联–link
#两个容器之间通过名字来互通网络,不用写ip了,但是只是单线的,tomcat02 ping不通 tomcat03
[root@bogon ~]# docker run -d -P --name tomcat03 --link tomcat02 tomcat
[root@bogon ~]# docker exec -it tomcat03 ping tomcat02
PING tomcat02 (172.17.0.3) 56(84) bytes of data.
64 bytes from tomcat02 (172.17.0.3): icmp_seq=1 ttl=64 time=0.393 ms
64 bytes from tomcat02 (172.17.0.3): icmp_seq=2 ttl=64 time=0.059 ms
####本质:–link就是在tomcat03的 /etc/hosts 中配置了tomcat02的映射,不推荐使用–link
自定义网络,docker0不支持通过容器名访问
查看所有的docker网络
[root@bogon ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
1f67aa1c1b0e bridge bridge local
cea1f7fd17ca host host local
65f7e0913e07 none null local
网络模式
Bridge:桥接docker(默认,自己创建也使用桥接模式)
None:不配置网络
Host:和宿主机共享网络
Container:容器网络连通(用的少)
3.创建自定义网络
#–driver bridge #桥接模式
#–subnet 192.168.0.0/16 #子网地址
#–gateway 192.168.0.1 #网关
[root@bogon ~]# docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
[root@bogon ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
1f67aa1c1b0e bridge bridge local
cea1f7fd17ca host host local
8c4f8ecbf764 mynet bridge local
65f7e0913e07 none null local
#查看自定义网络的详细信息
[root@bogon ~]# docker network inspect mynet
#用自己定义的网络开启两个容器
[root@bogon ~]# docker run -d -P --name tomcat-net01 --net mynet tomcat
WARNING: IPv4 forwarding is disabled. Networking will not work.
43b688f36e825f569ac51082236782dd74313cc1eb0db28c82e2374b217df887
[root@bogon ~]# docker run -d -P --name tomcat-net02 --net mynet tomcat
WARNING: IPv4 forwarding is disabled. Networking will not work.
30541b34bbaed0935711412fadefe2dbba17d5fdb604794aefdbd4ad0fc37284
##测试用容器名字互相ping
[root@bogon ~]# docker exec -it tomcat-net01 ping tomcat-net02
PING tomcat-net02 (192.168.0.3) 56(84) bytes of data.
64 bytes from tomcat-net02.mynet (192.168.0.3): icmp_seq=1 ttl=64 time=0.241 ms
64 bytes from tomcat-net02.mynet (192.168.0.3): icmp_seq=2 ttl=64 time=0.054 ms
64 bytes from tomcat-net02.mynet (192.168.0.3): icmp_seq=3 ttl=64 time=0.057 ms
64 bytes from tomcat-net02.mynet (192.168.0.3): icmp_seq=4 ttl=64 time=0.060 ms
64 bytes from tomcat-net02.mynet (192.168.0.3): icmp_seq=5 ttl=64 time=0.056 ms
###结论自己定义的网络,不使用–link也可以使用容器名字互相ping通,修复了docker0的缺点,推荐使用
4.网络连通
[root@bogon ~]# docker run -d -P --name tomcat01 tomcat
###测试打通tomcat01和tomcat-net01 是把tomcat01放到了mynet下!!!!!!
[root@bogon ~]# docker network connect mynet tomcat01
[root@bogon ~]# docker network inspect mynet

#查看tomcat01详细信息
[root@bogon ~]# docker inspect 8e355a7a6f42

现在是一个容器两个网卡,一个docker0,一个自定义网络mynet
#测试tomcat01 ping tomcat-net01
[root@bogon ~]# docker exec -it tomcat01 ping tomcat-net01
PING tomcat-net01 (192.168.0.2) 56(84) bytes of data.
64 bytes from tomcat-net01.mynet (192.168.0.2): icmp_seq=1 ttl=64 time=0.377 ms
64 bytes from tomcat-net01.mynet (192.168.0.2): icmp_seq=2 ttl=64 time=0.063 ms
结论:要跨网络操作别人就需要使用docker network connect连通

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值