Docker是管理容器的引擎。
Docker为应用打包、部署平台,而非单纯的虚拟化技术
准备一台虚拟机server1:
配置软件仓库,从官网下载的仓库!
[root@server1 ~]# cd /etc/yum.repos.d/ [root@server1 yum.repos.d]# vim docker.repo [docker] name=docker-ce baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/7/x86_64/stable/ gpgcheck=0
由于下载过程中会出现很多的依赖性,这些依赖性都是从centos源里面找到的,所以这里我们还需搭建一个centos源,这里可以参考阿里云镜像站
[root@server1 yum.repos.d]# vim CentOS-Base.repo # CentOS-Base.repo # # The mirror system uses the connecting IP address of the client and the # update status of each mirror to pick mirrors that are updated to and # geographically close to the client. You should use this for CentOS updates # unless you are manually picking other mirrors. # # If the mirrorlist= does not work for you, as a fall back you can try the # remarked out baseurl= line instead. # # [base] name=CentOS-7 - Base - mirrors.aliyun.com failovermethod=priority baseurl=http://mirrors.aliyun.com/centos/7/os/$basearch/ gpgcheck=1 gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7 #released updates [updates] name=CentOS-7 - Updates - mirrors.aliyun.com failovermethod=priority baseurl=http://mirrors.aliyun.com/centos/7/updates/$basearch/ gpgcheck=1 gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7 #additional packages that may be useful [extras] name=CentOS-7 - Extras - mirrors.aliyun.com failovermethod=priority baseurl=http://mirrors.aliyun.com/centos/7/extras/$basearch/ gpgcheck=1 gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7 #additional packages that extend functionality of existing packages [centosplus] name=CentOS-7 - Plus - mirrors.aliyun.com failovermethod=priority baseurl=http://mirrors.aliyun.com/centos/7/centosplus/$basearch/ gpgcheck=1 enabled=0 gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7 #contrib - packages by Centos Users [contrib] name=CentOS-7 - Contrib - mirrors.aliyun.com failovermethod=priority baseurl=http://mirrors.aliyun.com/centos/7/contrib/$basearch/ gpgcheck=1 enabled=0 gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7
本人本地有docker软件目录,所以直接下载!
[root@server1 yum.repos.d]# yum repolist [root@server1 yum.repos.d]# yum install -y docker-ce
开启服务,并开机自启
[root@server1 yum.repos.d]# systemctl enable docker
查看docker 信息:
[root@server1 yum.repos.d]# docker info
使用docker info 出现警告iptables的情况:
解决方式:
[root@server1 sysctl.d]# pwd /etc/sysctl.d [root@server1 sysctl.d]# vim docker.conf net.bridge.bridge-nf-call-iptables = 1 net.bridge.bridge-nf-call-ip6tables = 1 [root@server1 sysctl.d]# sysctl --system [root@server1 sysctl.d]# ip addr
因为本人本地有镜像直接本地拉取,没有的网上拉取!
[root@server1 ~]# docker search yakexi007 [root@server1 ~]# docker load -i mario.tar ##本地加载 [root@server1 ~]# docker pull yakexi007/game2048 ## 要是本地没有,就网上拉取拉取镜像 [root@server1 ~]# docker inmages
做端口映射 第一个80是宿主机的,第二个对应镜像的端口
-d是打入后台,–name 是给镜像取个名字
[root@server1 ~]# docker run -d --name game2048 -p 80:80 yakexi007/game2048 [root@server1 ~]# docker ps ##查询端口连接情况 [root@server1 ~]# docker ps -a ## 查看所有的,包括已经停掉的
[root@server1 ~]# docker history game2048:latest
然后访问docker主机的ip即可:172.25.0.1
接着删除拉取得镜像
[root@server1 ~]# docker rm -f demo
重新拉取镜像mario
做端口映射 第一个80是宿主机的,第二个对应镜像的端口
mario的镜像端口为8080!!!
docker load -i mario.tar docker run -d --name demo -p 80:8080 mario
访问172.25.0.1:
base镜像提供的是最小的Linux发行版
同一docker主机支持运行多种Linux发行版
采用分层结构的最大好处是:共享资源
拉取一个busybox作为实验环境
[root@server1 ~]# docker pull busybox [root@server1 ~]# docker run -it --name demo busybox
进入交互式
[root@server1 ~]# docker run -it --name demo busybox ls [root@server1 ~]#docker rm demo -i表示交互式,-t表示打开伪终端 [root@server1 ~]#docker run -it --name demo demo:v1
查看镜像 docker images
运行容器,创建文件!
docker run -it --name demo busybox
-a查看所有进程
docker ps -a
启动已有容器
docker start demo
查看进程
docker ps
进入已存在的demo容器中
docker container attach demo
上传新的镜像,源于demo容器 demo:v1
docker commit demo demo:v1 docker images
我们来对比查看两者层级结构
我们会发现demo:v1是在busybox的基础上又添加了一层!
docker history demo:v1 docker history busybox:latest
删除v1镜像
docker rmi demo:v1 docker images docker history busybox:latest
重启读取v1中的内容
docker commit demo demo:v1 docker images
注意,已经拉取了busybox再次拉取一定会报错!!如下:
删掉demo后,不影响v1镜像!
docker rm demo docker ps -a docker run -it --name demo demo:v1 ## 文件还在!!
对比层级结构查看,我们会发现:手动添加的容器没有解释每一层的作用,game2048里会有解释如下图:
docker history demo:v1 docker history game2048:latest
我们若是需要解决这个问题需要用文件的方式导入 镜像!
mkdir docker cd docker/ vim Dockerfile cat Dockerfile FROM busybox RUN echo westos > testfile
在当前目录文件Dockerfile下创建镜像
docker build -t demo:v2 . docker images docker history demo:v2
查看导入的镜像,可以查到镜像内容:
接着我们在文件Dockerfile里面再追加一行输出:
vim Dockerfile FROM busybox RUN echo westos > testfile RUN echo westos > helloworld
docker build -t demo:v3 . docker history demo:v3
同样可以看到记录追加了一条!
FROM busybox #镜像来源 RUN echo westos > testfile # RUN后跟shell运行语句 RUN echo westos > helloworld COPY index.html / #COPY拷贝当前目录的index.html到容器的根目录下
然后在docker目录下
echo westos > index.html
我们可以看到demo:v3里面可以看到index.html文件已经导入!
docker build -t demo:v3 . docker run -it --name demo demo:v3 ls
接下来我们需要在docker目录下放入一个nginx的压缩包:
添加配置文件!
ADD nginx-1.20.1.tar.gz / #ADD 解压tar包到根目录下
docker build -t demo:v4 . docker history demo:v4
我们需要每次加载docker之后,不希望保留进程!
那么需要加上参数 --rm
docker run -it --rm demo:v4
我们看到nginx已经被解压放入了docker中!
添加env expose参数没有效果,后面再演示!
ENV HOSTNAME server1 #ENV 定义变量HOSTNAME为server1 EXPOSE 80 #设定端口为80 VOLUME {"/data"} #挂载目录为/data
docker build -t demo:v5 . docker run -it --rm demo:v5
我们可以查看data是否挂载成功!
docker inspect demo
我们进入图上显示的路径下:
cd /var/lib/docker/volumes/**** echo westos >> helloworld echo westos >> helloworld echo westos >> helloworld echo westos >> helloworld
重新加载进入docker发现刚才导入的数据全部到docker中了!
docker ps docker attach **** ls cat helloworld
文件中添加CMD echo “hello world”
docker build -t demo:v6 . docker run --rm demo:v6
当文件写为如下就会报错,因为格式不正确
docker build -t demo:v7 . docker run --rm demo:v7
所以我们删掉镜像v7
修改文件使得可以输出主机名
docker build -t demo:v9 . docker run --rm demo:v9
若是在运行docker容器的时候,后面加上参数,那么就会覆盖之前的输出:
docker run --rm demo:v9 date
修改文件如下
输出会覆盖
CMD ["world"] docker1 build -t demo:v9 . docker run --rm demo:v9
后面添加参数会自动覆盖,如下:
删除掉刚才建立的镜像,使用快捷的指令直接删除!
docker rmi `docker images |grep ^demo | awk '{print $3}'`