一、简单说一说

容器是比虚拟机更加轻量级的虚拟化技术,容器是在操作系统层面上实现虚拟化,直接复用本地主机的操作系统,而传统虚拟机则是在硬件层面实现虚拟化。与传统的虚拟机相比,容器优势体现为启动速度快、占用体积小。

Docker是一个用于开发、交付和运行应用程序的容器管理平台,我们可以通过Docker把应用程序构建成一个镜像,然后通过Docker根据该镜像快速创建一个容器并运行该容器。
image-1671263293040

Docker采用C/S架构,如上图,Docker 客户端与Docker守护进程进行交互,该守护进程完成构建、运行和分发Docker容器的工作。Docker客户端和守护进程可以运行在同一系统上,也可以运行在不同服务器上。

二、快速安装

在线安装命令如下:

yum install docker-ce-20.10.* docker-cli-20.10.* -y

把docker的CgroupDriver改成systemd

mkdir /etc/docker
vim /etc/docker/daemon.json

{  
    "registry-mirrors": [
        "https://registry.docker-cn.com",
        "http://hub-mirror.c.163.com",
        "https://docker.mirrors.ustc.edu.cn"
       ],
   "exec-opts": ["native.cgroupdriver=systemd"],
   "max-concurrent-downloads": 10,  
   "max-concurrent-uploads": 5,  
   "log-opts": {    
      "max-size": "300m",    
      "max-file": "2"  
      },  
    "live-restore": true 
 } 

开机自启动

systemctl daemon-reload && systemctl enable --now docker

三、简单使用

1、镜像操作

(1)镜像检索
docker search 关键字
例如:docker search nginx,但我们通常都是到docker的镜像仓库https://hub.docker.com/去检索。

(2)镜像拉取
docker pull 镜像名:tag
例如:docker pull nginx:latest, 其中:tag是可选的,tag表示标签,多为软件的版本,默认是latest。

(3)查看所有本地镜像
docker images

(4)镜像删除
docker rmi 镜像ID
删除指定镜像ID的本地镜像

(5)保存镜像
docker save -o 保存的文件名.tar 镜像名

(6)加载本地镜像
docker load -i xxx.tar

2、容器操作

(1)启动容器:docker run [OPTIONS] IMAGE [COMMAND] [ARG … ]

(a)交互式启动:docker run -it --name=nginx1 --rm nginx bash
运行nginx镜像启动一个容器,并进入容器内部。使用exit退出容器。
-it: 交互式启动
–name=xxxx:给容器起个名字,可选。
–rm:对于交互界面时删除容器,可选。

(b)后台启动:docker run -d --name=nginx2 -p 12345:80 nginx
以后台的形式运行nginx容器
-d:后台启动
-p:映射端口,把nginx容器的80端口跟宿主机的12345端口进行映射,这样可以通过12345端口访问到nginx,例如:http://192.168.253.110:12345/

(2)查看容器
查看所有容器:docker ps -a
查看正在运行的容器:docker ps
查看容器日志:docker logs 容器ID

(3)启停容器
启动已停止的容器:docker start 容器ID/名称
重启容器:docker restart 容器ID/名称
停止容器:docker stop 容器ID/名称
强制停止容器:docker kill 容器ID/名称

(4)进入正在运行的容器并以命令行交互
第一种:docker exec -it 容器ID bash或者sh (强烈推荐)
第二种:docker attach 容器ID

主要区别是exec命令进入容器后退出,容器还在运行。而attach命令进容器后退出,容器停止,因此通常使用exec命令。

(5)容器与宿主机之间文件复制
从容器内复制文件到宿主机:docker cp 容器ID:容器内路径 宿主机路径
从宿主机内复制文件到容器:docker cp 宿主机路径 容器ID:容器内路径

四、镜像制作

我们除了可以通过docker pull拉取仓库中的镜像外,也可以自己手动制作镜像,通常我们自己开发的系统都需要自己制作镜像才能运行容器,制作镜像的方式有以下两种:
docker commit命令
docker build命令+Dockerfile文件

1. 方式一:docker commit

(1)手动在容器上安装JDK1.8
1)基于centos镜像创建容器
docker run -itd --name centos-jdk1.8 centos:latest bash
2)手动拷贝宿主机jdk到容器内
docker cp jdk-8u201-linux-x64.tar.gz centos-jdk1.8:/usr/local/src/
3)进入容器
docker exec -it centos-jdk1.8 bash
4)在容器内安装JDK
(a)解压JDK
cd /usr/local/src
tar -zxvf jdk-8u201-linux-x64.tar.gz -C /usr/local/
(b)配置环境变量
vi /etc/profile
export JAVA_HOME=/usr/local/jdk1.8.0_201
export PATH=JAVAHOME/bin:JAVA_HOME/bin:PATH

source /etc/profile
(c)测试效果
java -version
5)完成JDK的安装后退出容器
exit
6)构建镜像
用法:docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
docker commit -a=“chenzhenqing” -m=“jdk mirror” centos-jdk1.8 myjdk:1.8

-a:提交的镜像作者;
-c:使用 Dockerfile 指令来创建镜像;
-m:提交时的说明文字;
-p:在 commit 时,将容器暂停。
image-1671263663602

(2)打包镜像到本地
docker save -o /root/myjdk.tar myjdk
image-1671263684600

(3)把镜像拷贝到其他服务器(可选)
scp myjdk.tar root@192.168.253.111:/root

(4)导入镜像(可选)
docker load -i myjdk.tar
image-1671263703497

2. 方式二:Dockerfile

Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。Dockerfile场景命令如下:
(1)FROM:基于哪个镜像来实现
(2)MAINAINER:镜像作者
(3)ENV:声明环境变量
(4)RUN:执行命令
(5)ADD:添加宿主机文件到容器里,有需要解压的文件会自动解压
(6)COPY:拷贝宿主机文件到容器里,不会解压。
(7)WORKDIR:工作目录
(8)EXPOSE:容器暴露的端口
(9)CMD:容器启动后所执行的指令,如果执行ducker run 后面跟启动命令会被覆盖掉,另外如果CMD和ENTRYPOINT同时配置,则CMD作为ENTRYPOINT的参数。
(10)ENTRYPOINT:与CMD功能相同,启动容器时可以通过增加参数-entrypoint来覆盖。
(11)VOLUME:数据卷,将宿主机的目录映射到容器中的目录

下面我们基于方式一的例子用Dockerfile的方式制作jdk镜像。
(1)创建Dockerfile文件,内容如下

FROM centos:latest
MAINTAINER chenzhenqing
ADD jdk-8u201-linux-x64.tar.gz /usr/local
WORKDIR /usr/local/jdk1.8.0_201
RUN echo "export JAVA_HOME=/usr/local/jdk1.8.0_201" >> /etc/profile
RUN echo "export PATH=/usr/local/jdk1.8.0_201/bin:$PATH" >> /etc/profile
RUN echo "source /etc/profile" >> ~/.bashrc

(2)构建镜像
docker build -t myjdk2:1.8 .
注:最后的一点.表示Dockerfile所在的当前目录
image-1671263757549

(3)测试
查看镜像 docker images 看看是否有刚刚制作的镜像myjdk2
启动容器:docker run -it --rm myjdk2:1.8 bash
image-1671263775861

【一个Springboot模块的Dockerfile文件】

FROM eclipse/centos_jdk8:latest
COPY ncs-rest-1.0.0.jar app.jar
EXPOSE 8701
ENTRYPOINT ["java","-Xmx2048m","-jar","app.jar"]

执行镜像构建
docker build -t ncs-rest .

运行镜像:
docker run -d -p 8701:8701 --name ncs-rest ncs-rest

查看日志:
docker logs -f ncs-rest

打赏
支付宝 微信
上一篇 下一篇