Docker容器

Docker容器-配置、镜像分层、部署nginx、优化镜像、搭建仓库

本文主要是介绍Docker容器-配置、镜像分层、部署nginx、优化镜像、搭建仓库,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

目录

  • docker简介
    • docker和虚拟机的区别:
    • 容器是如何工作的
  • 配置docker
    • 搭建docker仓库
    • 下载docker-ce
    • 测试
  • 镜像的分层
    • 文件导入镜像
  • Dockerfile详解
    • 删除掉刚才建立的镜像
  • 镜像构建- -nginx

docker简介

Docker是管理容器的引擎。
Docker为应用打包、部署平台,而非单纯的虚拟化技术

docker和虚拟机的区别:

请添加图片描述

容器是如何工作的

请添加图片描述

配置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软件目录,所以直接下载!

下载docker-ce

[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

请添加图片描述

同样可以看到记录追加了一条!
请添加图片描述

Dockerfile详解

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}'`

请添加图片描述

镜像构建- -nginx

这篇关于Docker容器-配置、镜像分层、部署nginx、优化镜像、搭建仓库的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!