环境:centos8
参考:
安装 Docker | Docker 从入门到实践https://vuepress.mirror.docker-practice.com/install/
安装Docker
卸载旧版本,安装依赖包,添加yum软件源,更新 yum
软件源缓存,安装 docker-ce,启动docker,防火墙放行
添加镜像加速,在 /etc/docker/daemon.json
中写入如下内容(如果文件不存在请新建该文件):
{
"registry-mirrors": [
"https://hub-mirror.c.163.com",
"https://mirror.baidubce.com"
]
}
镜像、容器、仓库
Docker 镜像 是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像 不包含 任何动态数据,其内容在构建之后也不会被改变。
镜像(Image
)和容器(Container
)的关系,就像是面向对象程序设计中的 类
和 实例
一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
容器的实质是进程,但与直接在宿主执行的进程不同,容器进程运行于属于自己的独立的 命名空间 (opens new window)。因此容器可以拥有自己的 root
文件系统、自己的网络配置、自己的进程空间,甚至自己的用户 ID 空间。容器内的进程是运行在一个隔离的环境里,使用起来,就好像是在一个独立于宿主的系统下操作一样。这种特性使得容器封装的应用比直接在宿主运行更加安全。
镜像构建完成后,可以很容易的在当前宿主机上运行,但是,如果需要在其它服务器上使用这个镜像,我们就需要一个集中的存储、分发镜像的服务,Docker Registry 就是这样的服务。
一个 Docker Registry 中可以包含多个 仓库(Repository
);每个仓库可以包含多个 标签(Tag
);每个标签对应一个镜像。
基础命令
镜像:
获取镜像
docker pull [选项] [Docker Registry 地址[:端口号]/]仓库名[:标签]
例:docker pull ubuntu:18.04
列出镜像
docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
redis latest 5f515359c7f8 5 days ago 183 MB
nginx latest 05a60462f8ba 5 days ago 181 MB
删除本地镜像
docker image rm [选项] <镜像1> [<镜像2> ...]
容器:
运行一个容器
docker run [选项] [Docker Registry 地址[:端口号]/]仓库名[:标签]
例:docker run -itd ubuntu:18.04 bash //进入bash终端 ,-d 后台运行
终止容器/重启
docker container stop/restart
查看容器
docker container ls -a
进入容器
docker attach
命令或 docker exec
命令
区别: attach
命令下的exit,会导致容器的停止;exec的不会
docker attach 243c
docker exec -i 69d1 bash
注:只用 -i
参数时,由于没有分配伪终端,界面没有我们熟悉的 Linux 命令提示符,但命令执行结果仍然可以返回。
当 -i
-t
参数一起使用时,则可以看到我们熟悉的 Linux 命令提示符。
导入导出容器
docker export 7691a814370e > ubuntu.tar
cat ubuntu.tar | docker import - test/ubuntu:v1.0
docker import http://example.com/exampleimage.tgz example/imagerepo
删除容器
使用 docker container rm
来删除一个处于终止状态的容器
docker container rm trusting_newton
清理所有处于终止状态的容器
docker container prune
commit
当我们运行一个容器的时候(如果不使用卷的话),我们做的任何文件修改都会被记录于容器存储层里。而 Docker 提供了一个 docker commit
命令,可以将容器的存储层保存下来成为镜像。换句话说,就是在原有镜像的基础上,再叠加上容器的存储层,并构成新的镜像。以后我们运行这个新镜像的时候,就会拥有原有容器最后的文件变化。
docker commit [选项] <容器ID或容器名> [<仓库名>[:<标签>]]
docker commit \
--author "Tao Wang <twang2218@gmail.com>" \
--message "修改了默认网页" \
webserver \
nginx:v2
使用 docker commit
意味着所有对镜像的操作都是黑箱操作,生成的镜像也被称为 黑箱镜像,换句话说,就是除了制作镜像的人知道执行过什么命令、怎么生成的镜像,别人根本无从得知。而且,即使是这个制作镜像的人,过一段时间后也无法记清具体的操作。
Docker export和docker commit的区别:
Docker export:Export a container's filesystem as a tar archive 保存文件系统快照
Docker commit:Create a new image from a container's changes 根据变更生成新镜像
使用 Dockerfile 定制镜像
Dockerfile 是一个文本文件,其内包含了一条条的 指令(Instruction),每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。
案例:
使用Dockerfile构建镜像:
在docker1:
基于nginx的基础镜像,修改网站根目录为/webdir
使用RUN命令修改主页index.html的内容为index
使用COPY命令添加页面page1.html和page2.html,内容分别为page1和page2
构建镜像名为nginx-test:v1,构建完镜像后,将镜像发送到docker2
docker pull nginx
mkdir /nginxdir
cd /nginxdir/
touch Dockerfile
echo "page1" > page1.html
echo "page2" > page2.html
vim Dockerfile
FROM nginx
RUN mkdir -p /webdir && mv /usr/share/nginx/html/* /webdir/
RUN rm -rf /usr/share/nginx/html && ln -s /webdir /usr/share/nginx/html
RUN echo "index" > /webdir/index.html
COPY page1.html /webdir/
COPY page2.html /webdir/
docker build -t nginx-test:v1 .
cd ~
docker save -o nginx-test_v1.tar nginx-test:v1
scp nginx-test_v1.tar root@192.168.68.134:/root/
在docker2:
导入镜像,并运行容器,将nginx的80端口映射到docker2的82端口
设置防火墙默认区域为public
docker load -i nginx-test_v1.tar
firewall-cmd --permanent --add-port=82/tcp --zone=public
firewall-cmd --reload
docker run -d --name my-nginx -p 82:80 nginx-test:v1
验证效果:
在docker1:
Curl docker2ip:82--------àindex
Curl docker2ip:82/page1.html--------àpage1
Curl docker2ip:82/page2.html--------àindex2
从空白镜像创建Docker
http://t.csdnimg.cn/TORxbhttp://t.csdnimg.cn/TORxb