文章目录
1.安装
1.1安装repo源
cd /etc/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
下载centos7的repo源
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
替换为centos的源
sed -i -e '/mirrors.cloud.aliyuncs.com/d' -e '/mirrors.aliyuncs.com/d' /etc/yum.repos.d/CentOS-Base.repo
vim CentOS-Base.repo
:%s/$releasever/7/g #替换
1.2安装docker
yum install docker-ce -y #安装docker-ce
systemctl enable docker --now
docker info
可以查看当前容器信息
调整网络映射:
sysctl -a |grep bridge-nf-call-iptables
net.bridge.bridge-nf-call-iptables = 0
sysctl: reading key "net.ipv6.conf.all.stable_secret"
sysctl: reading key "net.ipv6.conf.default.stable_secret"
sysctl: reading key "net.ipv6.conf.docker0.stable_secret"
sysctl: reading key "net.ipv6.conf.eth0.stable_secret"
sysctl: reading key "net.ipv6.conf.lo.stable_secret"
cd /etc/sysctl.d
vim docker.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
用sysctl --system
查看更改已生效
创建完成后会成一个docker0的桥接接口,本机所有容器都会桥接到该网卡上,地址为172.12.0.1/16
,且本机虚拟机能上网,则容器也可以上网。
1.3 测试
查看:docker search yakexi007
加载到本地:docker pull yakexi007/game2048
列出本机项目:docker images
查看正在运行的容器:docker ps
搜索:docker search ***
:官方镜像前面不带名字
更改镜像名称:docker tag yakexi007/game2048:latest game2048:latest
删除镜像:docker rmi yakexi007/game2048
查看docker层数:docker history busybox:latest
查看正在运行的docker:docker ps -a
开始:docker start ID
停止:docker stop ID
进入容器:docker container attach nice_haibt/ID
退出容器后保持容器开启:1.启动容器;2.进入容器;3.<ctrl>+<p>+<q>
2.镜像的分层结构
一个完整的docker镜像可以支撑一个docker容器的运行,在 Docker容器运行过程中主要提供文件系统视角。例如一个ubuntu:14.04的镜像,提供了一个基本的ubuntu:14.04的发行版,当然此 镜像是不包含操作系统Linux内核的。
- 共享主机的kernel
- base镜像提供的是最小的linux发行版
- 同一docker主机支持运行多种linux发行版
- 采用分层结构的最大好处时共享资源
docker封装的是文件系统
2.1 镜像的分层结构
2.2 镜像的构建
运行镜像:docker run -it --name demo demo:v1
注:容器(container)是运行在镜像(images)之上的,一般删除镜像前需要先停止在其上运行的容器,相关的操作有:
查看所有镜像:docker images
查看所有正在运行的容器:docker ps
查看所有已退出的容器:docker ps -a
删除镜像:docker rmi 镜像ID
删除容器:docker rm容器ID
1.docker commit
在修改容器后,退出保存时:
docker commit [options] container [repository[:tag]],
Options:
-a, --author string Author (e.g., "John Hannibal Smith <hannibal@a-team.com>")
-c, --change list Apply Dockerfile instruction to the created image
-m, --message string Commit message
-p, --pause Pause container during commit (default true)
例如:docker commit -m "add files" demo demo:v1
2.docker build(有审计,内部每一步都由docker commit生成)
mkdir docker
cd docker/
vim Dockerfile
FROM busybox
RUN touch file1
RUN mkdir westos
docker build -t demo1:v1 .
3.docker file详解
3.1 常用命令
cat Dockerfile
FROM busybox
RUN touch file1
COPY index.html /
docker build -t demo:v1 .
Sending build context to Docker daemon 3.072kB
Step 1/3 : FROM busybox
---> b97242f89c8a
Step 2/3 : RUN touch file1
---> Using cache
---> 1caaf0bd69fe
Step 3/3 : COPY index.html /
---> c624f337bf49
Successfully built c624f337bf49
Successfully tagged demo:v1
docker run -it --rm demo:v1
/ # ls
bin etc home proc sys usr
dev file1 index.html root tmp var
add可实现容器内解压
tar zcf test.tar.gz /etc
vim Dockerfile
FROM busybox
RUN touch file1
COPY index.html /
ADD test.tar.gz /mnt
docker build -t demo:v2 .
ENV:
vim Dockerfile
FROM busybox
RUN touch file1
COPY index.html /
ADD test.tar.gz /mnt
ENV HOSTNAME server4
下载nginx.tar
载入docker:docker load -i nginx.tar
vim Dockerfile
FROM busybox
RUN touch file1
COPY index.html /
ADD test.tar.gz /mnt
ENV HOSTNAME server4
EXPOSE 80
为本机随便指定一个接口:dcoker run -d --name demo -P nginx
容器在运行时的内存和宿主机是相同的,用free -m
查看时,容器和宿主机(虚拟机)内存占用相同。
查看docker volume:docker volume ls
vim Dockerfile
FROM busybox
RUN touch file1
COPY index.html /
ADD test.tar.gz /mnt
ENV HOSTNAME server4
EXPOSE 80
VOLUME ["/data"]
CMD echo "hello world"
docker build -t demo:v6 .
docker run --rm demo:v6
hello world
此处也可以使用变量:
vim Dockerfile
FROM busybox
RUN touch file1
COPY index.html /
ADD test.tar.gz /mnt
ENV HOSTNAME server4
EXPOSE 80
VOLUME ["/data"]
CMD echo "hello $HOSTNAME"
docker run --rm demo:v7
hello server4
最后,通过脚本删除demo:v*
docker rmi `docker images |grep demo |awk '{print $1":"$2}'
3.2 设置阿里云镜像加速器
需要自己注册阿里云账户,然后按照提示在指定位置写入自己的加速文件,然后reload,restart
3.3 对rhel7精简版进行编译升级
docker load -i rhel7.tar
由于该版本不带bash,所以每次运行时需要附带bash
docker run -it --name demo rhel7 bash
在docker文件夹下准备dvd.repo,nginx-1.18.0.tar.gz
vim Dockerfile
FROM rhel7
COPY dvd.repo /etc/yum.repos.d/
ADD nginx-1.18.0.tar.gz /mnt
WORKDIR /mnt/nginx-1.18.0
RUN rpmdb --rebuilddb
RUN yum install -y gcc make pcre-devel zlib-devel
RUN ./configure
RUN make
RUN make install
EXPOSE 80
VOLUME ["/usr/local/nginx/html"]
CMD ["/usr/local/nginx/sbin/nginx", "-g", "daemon off;"]
webserver:v1编译完成
运行该镜像:docker run -d --name webserver webserver:v1
查看该镜像编译历史:docker history webserver:v1
查看容器的具体信息:docker impacket webserver
得到容器的地址为172.17.0.2
在server1中进入该docke挂载的卷宗:
cd /var/lib/docker/volumes/e72f7ca5cda852e8f584248a4c21070ec8a1a50d4fa303ba64eee503fa98fd69/_data
为容器设置一个访问首页:echo www.lee.org > test.html
解析:
curl 172.17.0.2/test.html
www.lee.org
优化镜像思路:
- 选择最精简的基础镜像
- 减少镜像的层数
- 清理镜像构建的中间产物
- 注意优化网络请求
- 尽量去用构建缓存
- 使用多阶段构建镜像