1. Docker介绍
1.1 Docker出现的背景
由于在实际开发中会有很多不同的环境:1.开发环境 2.测试环境 3.生产环境 。不同的环境会带来很多意料之外的问题,由此Docker应运而生。
1.2 什么是Docker?
Docker 是一个开源的应用容器引擎,使应用程序可以在不同的环境中运行,而不需要修改代码。
Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,实现了“Build,Ship and Run Any App,Anywhere”的目标。
1.3虚拟机和容器
虚拟机:在一种操作系统里面运行另一种操作系统。例:windows系统里运行linux系统。
虚拟机缺点:启动慢,占用资源多。
linux容器:由于虚拟机存在的缺点,而出现的另一种linux容器虚拟化技术,容器不是模拟一个完整的操作系统,只需要软件所需的库资源和设置。
Docker 将应用运行在容器上面,所以可以把Docker看做是mini版的Linux。
1.4 Docker 核心概念
概念 | 说明 |
docker镜像 | 软件打包好的用于创建docker容器的模板(类) |
dacker容器 | 运行中的镜像称之为容器(对象) |
docker仓库 | 用来保存各种打包好的软件镜像 |
2.Docker环境安装
2.1 安装Docker
1、查看内核版本,docker要求linux内核3.8以上
[root@localhost ~]# uname -a
2、把yum包更新到最新
[root@localhost ~]# yum update #可省略
3、安装需要的软件包, yum-util 提供yum-config-manager功能
[root@localhost ~]# yum install -y yum-utils
4、设置镜像仓库
[root@localhost ~]# yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
5、安装docker
[root@localhost ~]# yum -y install docker-ce
2.2.启动和关闭
启动:
[root@localhost ~]# systemctl start docker #启动
查看状态:
[root@localhost ~]# systemctl status docker #状态
停止:
[root@localhost ~]# systemctl stop docker #关闭
重启:
[root@localhost ~]# systemctl restart docker #重启docker
设置docker开机自启动:
[root@localhost ~]# systemctl enable docker
2.3.配置阿里云镜像加速
1.登录阿里云(http://dev.aliyun.com)
2.在控制台搜索容器镜像服务
3.找到镜像加速器
4、配置镜像加速
[root@localhost ~]# sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://crhn72f8.mirror.aliyuncs.com"]
}
EOF
[root@localhost ~]# sudo systemctl daemon-reload
[root@localhost ~]# sudo systemctl restart docker
5.测试
[root@localhost ~]# docker info
... ...
Registry Mirrors:
https://crhn72f8.mirror.aliyuncs.com/
3.Docker常用命令
3.1.镜像命令
3.1.1检索
语法:
docker search IMAGE |
案例:
[root@localhost ~]# docker search tomcat NAME DESCRIPTION STARS OFFICIAL tomcat Apache Tomcat is an ... 2823 [OK] tomee Apache TomEE is an ... 82 [OK] dordoka/tomcat Ubuntu 14.04, Tomcat 8 ba... 55 bitnami/tomcat Bitnami Tomcat Docker Image... 35 |
3.1.2.拉取
从Docker仓库下载镜像到本地,镜像名称格式为 名称:版本号,如果版本号不指定则是最新的版本。
语法:
docker pull IMAGE:TAG |
案例:
[root@localhost ~]# docker pull tomcat [root@localhost ~]# docker pull centos |
3.1.3.列表
列出本地主机上的镜像
语法:
docker images |
案例:
[root@localhost ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE tomcat latest 904a98253fbf 12 days ago 680MB redis 3.0 c44fa74ead88 4 years ago 91.6MB |
3.1.4.删除
使用 docker rmi 命令删除镜像。
语法:
docker rmi IMAGE[:tag] |
案例:
[root@localhost ~]# docker rmi tomcat
|
3.2.容器命令
3.2.1.新建并启动容器
语法:
docker run [options] IMAGE[:TAG] |
OPTIONS说明:有些是一个减号,有些是两个减号
--name:为容器指定一个名称
-p:指定端口映射,hostPost:containerPort
-d:后台模式运行容器
案例:
[root@localhost ~]# docker run tomcat ... ... [root@localhost ~]# docker run --name tomcat_1 -p 8081:8080 tomcat ... ... [root@localhost ~]# docker run --name tomcat_2 -p 8081:8080 -d tomcat 93de8d28eb0dda52bf161be70510b189b6e0babdb430dd0636fddf45a78f1d71 [root@localhost ~]# |
3.2.2 启动容器
语法:
docker ps [options] |
OPTIONS说明:
-a :列出当前所有正在运行的容器+历史上运行过的
[root@localhost ~]# docker ps [root@localhost ~]# docker ps -a |
3.2.3.停止容器
语法:
docker stop CONTAINER NAME 或 docker kill CONTAINER NAME #不推荐使用,容易造成容器服务不正常关闭,影响后续使用。 |
[root@localhost ~]# docker stop tomcat_1 mysql_1 #速度慢 [root@localhost ~]# docker kill tomcat_1 mysql_2 #速度快 |
3.2.4.启动容器
语法:
docker start CONTAINER NAME |
案例:
[root@localhost ~]# docker start tomcat_1 tomcat_1 |
3.2.5.删除容器
语法:
docker rm CONTAINER NAME |
案例:
[root@localhost ~]# docker rm tomcat_1 tomcat_1 |
3.2.6 与运行中的容器交互
语法:
docker exec [options] CONTAINER NAME [command] |
exec说明:
在运行中的容器中执行命令
OPTIONS说明:
-i:以交互模式运行容器,通常与-t 连用
-t:为容器重新分配一个伪终端,通常与-i 连用
command说明:
/bin/bash:放在镜像名后的是命令,这里我们希望有个交互式 Shell,用来解释执行linux指令
案例:
[root@localhost ~]# docker run -t --name centos_1 centos:7 [root@localhost ~]# docker exec -it tomcat /bin/bash |
3.2.7 查看容器日志
语法:
docker logs CONTAINER NAME |
案例:
[root@localhost ~]# docker logs tomcat_2 |
4.Docker数据卷
4.1.数据卷概念
1.docker容器删除后,在容器中产生的数据还在吗? 比如我在redis的容器里面存储了数据,删除了redis容器之后,数据是否还在?
2.docker容器和外部机器可以直接交换文件吗? 比如我们可以在windows里面编写代码之后,直接部署tomcat容器里面吗?
*数据卷概念
数据卷是宿主机中的一个目录或文件,数据卷设计的目的在于数据的持久化和共享数据,它完全独立于容器的生存周期;作用是容器数据持久化、外部机器和容器之间数据交换;
语法:创建启动容器时,使用 –v 参数 设置数据卷。如果目录不存在,会自动创建。
docker run –v 宿主机目录:容器内目录 |
4.2.容器与宿主机之间的数据共享
1.建立一个名为c1的容器,并挂载宿主机目录/root/data_host,对应容器目录/root/data_container
[root@localhost ~]# docker run --name c1 -id -v /root/data_host:/root/data_container centos #启动容器, docker容器运行时必须有一个进程,否则容器立即自杀
b17764ac91316795889b674a70de2029a6b2a902023328accf12160c535bfcd8
[root@localhost ~]# ll
总用量 8
-rw-------. 1 root root 1571 10月 19 16:49 anaconda-ks.cfg
drwxr-xr-x. 2 root root 6 12月 1 17:09 data_host #自动创建data_host
-rw-r--r--. 1 root root 1619 10月 20 00:53 initial-setup-ks.cfg
drwxr-xr-x. 2 root root 6 10月 19 17:03 公共
drwxr-xr-x. 2 root root 6 10月 19 17:03 模板
... ...
[root@localhost ~]#
2.在宿主机data_host目录里面创建一个文件,检查容器的data_container目录是否同步
[root@localhost ~]# cd data_host/
[root@localhost data_host]# touch a.txt
[root@localhost data_host]# docker exec -it c1 /bin/bash
[root@33001b1e7251 ~]# ll
total 4
-rw-------. 1 root root 3416 Nov 13 2020 anaconda-ks.cfg
drwxr-xr-x. 2 root root 19 Dec 1 09:13 data_container
[root@33001b1e7251 ~]# cd data_container/ #自动创建data_host
[root@33001b1e7251 data_container]# ll
total 0
-rw-r--r--. 1 root root 0 Dec 1 09:13 a.txt #同步a.txt
[root@33001b1e7251 data_container]#
4.3.容器与容器之间的数据共享
1.创建容器c2,挂载data_host数据卷。
[root@localhost ~]# docker run --name c2 -id -v /root/data_host:/root/data_container centos:7 #新建并启动容器
2. 在c2容器里面创建一个文件,检查c1容器是否同步
[root@localhost data_host]# docker exec -it c2 /bin/bash
[root@952232b7e451 ~]# cd /root/data_container/
[root@952232b7e451 data_container]# touch b.txt #创建文件
[root@952232b7e451 data_container]# exit
exit
[root@localhost data_host]# docker exec -it c1 /bin/bash
[root@33001b1e7251 /]# cd /root/data_container/
[root@33001b1e7251 data_container]# ll
total 0
-rw-r--r--. 1 root root 0 Dec 1 09:13 a.txt
-rw-r--r--. 1 root root 0 Dec 1 09:50 b.txt #同步文件
[root@33001b1e7251 data_container]#
5.docker的应用安装
docker安装mysql
问题:容器内的网络服务和外部机器不能直接通信
解决方案:
当容器中的网络服务需要被外部的机器访问时,可以将容器中提供服务的端口映射到宿主机的端口上,外部机器访问宿主机上的端口,从而间接访问容器的服务。(这种操作称为容器映射)。
安装步骤:
1.拉取mysql镜像
docker pull mysql:5.7 |
2.创建容器
docker run -p 3306:3306 --name mysql \ -v /usr/local/docker/mysql/data:/var/lib/mysql \ -e MYSQL_ROOT_PASSWORD=1111 \ -d mysql:5.7 |
参数说明:
-e:配置信息,此处配置mysql的root用户的登陆密码
3.操作容器中的mysql
6.Docker File
6.1.是什么Docker File?
Docker File是用来构建 Docker 镜像的构建文件,是由一系列命令和参数构成的脚本。
从应用软件的角度来看,Docker File、Docker镜像与Docker容器分别代表软件的三个不同阶段,Docker File面向开发,Docker镜像成为交付标准,Docker容器则涉及部署与运维,三者缺一不可,合力充当Docker体系的基石。
6.2.Docker File常用指令
-
FROM:指定构建使用的基础镜像,
FROM
命令必须写在其他的指令前 -
EXPOSE:声明容器对外暴露的端口号
-
ENV:设置环境变量,可以在容器内获取使用
-
WORKDIR:终端默认的工作目录
-
VOLUME :使容器内的一个目录具有持久化存储的功能
-
RUN:容器构建时需要运行的命令
-
CMD: 指定一个容器启动时要运行的命令,如果指定了多条
CMD
命令,则只有最后一条会被执行;CMD会被docker run之后的参数替换。 -
ENTRYPOINT:同
CMD
,但docker run之后的参数会传递给ENTRYPOINT形成新的命令组合。 -
ADD:从src复制文件到容器中的dest,并自动提取压缩格式的文件
-
COPY:类似于ADD,不支持压缩包
-
MAINTAINER:用于为Dockerfile署名
-
ONBUILD:当构建一个被继承的Dockerfile时运行命令,父镜像在被子继承后,父镜像的onbuild被触发。
6.3.Docker File 入门
6.3.1.hub默认centos
6.3.1.1.测试
[root@localhost ~]# docker run -it centos:7 #运行centos容器
[root@2ec46814342e /]# pwd
/
[root@2ec46814342e /]# vim a.txt
bash: vim: command not found
[root@2ec46814342e /]# ifconfig
bash: ifconfig: command not found
6.3.1.2问题:
1.默认工作目录是/
2.默认不支持vim
3.默认不支持ifconfig
6.3.2.自定义centos
6.3.2.1.需求
-
登陆后的默认路径
-
vim编辑器
-
查看网络配置ifconfig支持
6.3.2.2.编写Dockerfile
准备:
[root@localhost ~]# mkdir /usr/local/docker
[root@localhost ~]# cd /usr/local/docker
[root@localhost docker]# vim Dockerfile
Dockerfile内容:
#继承centos:7
FROM centos:7
MAINTAINER mgw<mgw@126.com>
ENV MYPATH /usr/local
WORKDIR $MYPATH
RUN yum -y install vim
6.3.2.3.构建
语法:
docker build [OPTIONS] PATH |
OPTIONS说明:
-f:DockerFile路径
-t:自定义镜像名称:TAG
例如:
[root@localhost docker]# docker build -f Dockerfile -t mycentos:1.0 . |
6.3.2.4.测试、
[root@localhost docker]# docker run -it --name mycentos mycentos:1.0
[root@1eaed8189758 local]# vim a.txt
[root@1eaed8189758 local]# pwd
/usr/local
[root@1eaed8189758 local]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.17.0.2 netmask 255.255.0.0 broadcast 172.17.255.255
ether 02:42:ac:11:00:02 txqueuelen 0 (Ethernet)
RX packets 6 bytes 516 (516.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
loop txqueuelen 1000 (Local Loopback)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
6.3.2.5.压缩镜像
如果我们要把镜像给别人使用,需要压缩镜像:
[root@localhost docker]# docker save -o mycentos.1.0.rar mycentos:1.0
[root@localhost docker]# ls
Dockerfile mycentos.1.0.rar mysql redis tomcat
6.3.2.6.解压镜像
如果被人要用这个镜像,只需要把这个压缩文件解压即可:
[root@localhost docker]# docker rmi mycentos:1.0
[root@localhost docker]# docker load -i mycentos.1.0.rar
6.3.2.7.查看镜像历史变更
[root@localhost docker]# docker history mycentos:1.0
6.4.自定义tomcat
6.4.1上传安装包
注意:Docker File要跟安装包在同一目录
6.4.2编写Docker File
FROM centos:7
MAINTAINER mgw<mgw@126.com>
#把java与tomcat添加到容器中
ADD jdk-8u191-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-8.5.100.tar.gz /usr/local/
#安装vim编辑器
RUN yum -y install vim
#设置工作访问时候的WORKDIR路径,登录落脚点
ENV MYPATH /usr/local
WORKDIR $MYPATH
#配置java与tomcat环境变量
ENV JAVA_HOME /usr/local/jdk1.8.0_191
ENV PATH $PATH:$JAVA_HOME/bin
#容器运行时监听的端口
EXPOSE 8080
#启动时运行tomcat
# ENTRYPOINT ["/usr/local/apache-tomcat-8.5.100/bin/startup.sh"]
CMD ["/usr/local/apache-tomcat-8.5.100/bin/startup.sh"]
6.4.3测试
1.构建并启动
[root@localhost docker]# docker build -f DockerFile -t mytomcat .
[root@localhost docker]# docker run -d -p 8080:8080 --name tomcat \
-v /usr/docker/tomcat/webapps/test:/usr/local/apache-tomcat-8.5.100/webapps/test \
-v /usr/docker/tomcat/logs:/usr/local/apache-tomcat-8.5.100/logs \
mytomcat
2.访问tomcat