软件开发最大的问题之一,就是环境配置。
开发环境没错,测试环境报错。最后发现是jdk环境不对造成的
测试环境没错,生产环境报错。最后发现是依赖没有安装,或者环境变量没有配置
为了解决上面的问题,很多人就在想,能不能在安装的时候,把原始环境一模一样地复制过来。
虚拟机就是带环境安装的一种解决方案。它可以在一种操作系统里面运行另一种操作系统,应用程序对此毫无感知,因为虚拟机看上去跟真实系统一模一样。但是它有个很大的缺点就是耗费资源太多了。想一下,如果你这个应用程序只会占用几十m的内存,但是虚拟机就要占用至少几百m的内存,这样资源利用率是非常低的。而且启动也比较慢,经常需要花费几分钟的时间。
由于虚拟机的缺点,Linux 发展出了另一种虚拟化技术:Linux 容器(Linux Containers,缩写为 LXC)。它不是模拟一个完整的操作系统,而是对进程进行隔离。或者说,在正常进程的外面套了一个保护层。对于容器里面的进程来说,它接触到的各种资源都是虚拟的,从而实现与底层系统的隔离。相对于虚拟机来说,它的优点就很明显了:
- 启动快:启动容器相当于启动本机的一个进程,而不是启动一个操作系统,速度快很多。
- 资源占用率低:容器只占用需要的资源,不占用那些没有用到的资源,并且容器之间可以共用本机资源,资源利用率是比较高的。
说了这么多,那docker是什么呢,先看一下百度百科的解释:
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的Linux或Windows机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。
这里出现了一个新词:应用容器引擎
,那什么是应用容器引擎
呢?
上面说的LXC仅为一种轻量级的容器化技术,它仅能对部分资源进行限制,无法做到诸如网络限制、磁盘空间占用限制等。dotCloud公司结合LXC和以下列出的技术实现了Docker容器引擎,相比于LXC,Docker具备更加全面的资源控制能力,是一种应用级别的容器引擎。
Docker引擎运行在操作系统上,是基于内核的LXC、Chroot(该技术能在container里构造完整的Linux文件系统)等技术实现容器的环境隔离和资源控制,在容器启动后,容器里的进程直接与内核交互,无需经过Docker引擎中转,因此几乎没有性能损耗,能发挥出裸机的全部性能。但由于Docker是基于Linux内核技术实现容器化的,因此使得容器内运行的应用只能运行在Linux内核的操作系统上。
概念啥的只需要了解一下就行了,毕竟我们不是专门做运维的,只需要知道一些常用的docker命令,出现问题了知道怎么排查就行了,再复杂的东西交给运维来做就行了。接下来就讲讲下面几个方面:
- 环境搭建
- 常用命令
- 常用软件部署
- 如何制作一个docker镜像
一. 环境搭建
centos下docker的安装
安装所需的软件包:
sudo yum install -y yum-utils \
device-mapper-persistent-data \
lvm2
复制代码
设置阿里云的源:
sudo yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
复制代码
安装最新的docker:
sudo yum install docker-ce docker-ce-cli containerd.io
复制代码
Docker 安装完默认未启动,需要启动:
sudo systemctl start docker
复制代码
测试一下docker是否安装启动成功:
sudo docker run hello-world
复制代码
出现上面的提示说明docker是启动成功的。
接下来还需要配置一下docker镜像加速,因为某些原因国内从DockerHub拉镜像下来会非常慢,所以可以配置一下国内镜像加速服务,这里我用的阿里云,阿里云镜像获取地址:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors,登录后在侧边栏镜像加速器获取到加速地址:
https://lingxiao.mirror.aliyuncs.com
复制代码
然后在 /etc/docker/daemon.json文件中配置地址:
vim /etc/docker/daemon.json
# 添加下面的内容
{"registry-mirrors":["https://lingxiao.mirror.aliyuncs.com"]}
复制代码
最后需要重新启动一下docker:
sudo systemctl daemon-reload
sudo systemctl restart docker
复制代码
win10下docker的安装
在Window上安装的Docker引擎其实是利用了Window自带的Hyper-V虚拟化工具自动创建了一个Linux系统,容器内的操作实际上是间接使用这个虚拟系统实现的。
Hyper-V 是微软开发的虚拟机,类似于 VMWare 或 VirtualBox,仅适用于 Windows 10。
通过命令来启用 Hyper-V ,右键开始菜单并以管理员身份运行 PowerShell,执行下面的命令:
Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V -All
复制代码
Docker Desktop 官方下载地址: hub.docker.com/editions/co…
下载完成后直接安装就可以了。
镜像加速也要配置一下:
然后点击Apply&Restart就会自动重启。
二. 常用命令
先介绍一些概念: 镜像(image):类似虚拟机镜像,可以把它看做我们下载的.iso文件 容器(container ):依赖于镜像,类似linux系统环境,运行和隔离应用。容器从镜像启动的时候,docker会在镜像的最上一层创建一个可写层,镜像本身是只读的,保持不变。
接下以创建一个jdk环境的容器为例
1.镜像相关命令
查看镜像
docker images
复制代码
这个时候是没有任何镜像的:
[root@host1592875735 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
复制代码
搜索镜像
docker search [名字]
复制代码
我们可以搜一下有哪些可用jdk镜像:
[root@host1592875735 ~]# docker search openjdk
openjdk OpenJDK is an open-source implementation of … 2569 [OK]
adoptopenjdk Official Images for OpenJDK + HotSpot and Op… 228 [OK]
adoptopenjdk/openjdk11 Docker Images for OpenJDK Version 11 binarie… 115
adoptopenjdk/openjdk8 Docker Images for OpenJDK Version 8 binaries… 80
adoptopenjdk/openjdk8-openj9 Docker Images for Eclipse OpenJ9 Version 8 b… 41
adoptopenjdk/openjdk11-openj9 Docker Images for Eclipse OpenJ9 Version 11 … 32
arm64v8/openjdk OpenJDK is an open-source implementation of … 22
adoptopenjdk/openjdk12 Docker Images for OpenJDK Version 12 binarie… 18
arm32v7/openjdk OpenJDK is an open-source implementation of … 16
shipilev/openjdk OpenJDK development builds 11
circleci/openjdk CircleCI images for OpenJDK 10 [OK]
adoptopenjdk/openjdk13 Docker Images for OpenJDK Version 13 binarie… 8
adoptopenjdk/openjdk14 Docker Images for OpenJDK Version 14 binarie… 8
adoptopenjdk/openjdk15 Docker Images for OpenJDK Version 15 binarie… 4
adoptopenjdk/openjdk10 Docker Images for OpenJDK Version 10 binarie… 3
amd64/openjdk OpenJDK is an open-source implementation of … 2
adoptopenjdk/openjdk9 Docker Images for OpenJDK Version 9 binaries… 2
symphonicsoft/openjdkbase Openjdk base images with dumb-init 1
winamd64/openjdk OpenJDK is an open-source implementation of … 1
suranagivinod/openjdk8 openjdk:8-jre-slim, zip & unzip 0
cimg/openjdk The CircleCI OpenJDK (Java) Docker Convenien… 0
classmethod/openjdk-with-git docker image for openjdk and git 0 [OK]
cfje/openjdk OpenJDK Builder Image 0
ccistaging/openjdk CircleCI images for OpenJDK 0 [OK]
ccitest/openjdk CircleCI test images for OpenJDK 0 [OK]
复制代码
拉取镜像
docker pull [名字]
复制代码
就拉第一个镜像吧:
[root@host1592875735 ~]# docker pull openjdk
Using default tag: latest
latest: Pulling from library/openjdk
a73adebe9317: Pull complete
01539a440662: Pull complete
89c470979f08: Pull complete
Digest: sha256:1af79a05f92a28af69a3f5dc2466297be071f86101e308553c85b5d59020e638
Status: Downloaded newer image for openjdk:latest
docker.io/library/openjdk:latest
[root@host1592875735 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
openjdk latest bc2876126561 7 days ago 486MB
复制代码
删除镜像
docker rmi [镜像id/名字]
复制代码
删除指定的镜像 ,比如none镜像
docker rmi $(docker images | grep "none" | awk '{print $3}')
复制代码
2.容器相关命令
查看正在运行的容器
docker ps
复制代码
查看所有容器
docker ps -a
复制代码
查看最后一次运行的容器
docker ps -f status=exited
复制代码
镜像拉成功了,但是我们没有创建容器,所以上面命令是看不见任何东西的。
创建与启动容器
创建容器命令: docker run
-i:表示运行容器
-t:表示容器启动后会进入命令行。加入这两个参数后,容器创建之后就能登录进去,即分配一个伪终端
--name:为创建的容器命名
-v:表示目录映射关系 前面是宿主机目录,后面是映射到docker容器上的目录,可以使用多个-v做多个目录或文件映射。
-d:在run后加上-d参数,会创建一个守护式容器在后台运行。和-t相反
-p:表示端口映射,前面是宿主机端口,后面是容器内的映射端口。
-
交互式方式创建容器(创建成功之后会自动登录容器,退出当前容器之后,容器会变成停止状态)
docker run -it --name=容器名称 镜像名称:标签 /bin/bash 复制代码
创建一个jdk容器:
[root@host1592875735 ~]# docker run -it --name=jdk openjdk /bin/bash bash-4.4# java -version openjdk version "15.0.1" 2020-10-20 OpenJDK Runtime Environment (build 15.0.1+9-18) OpenJDK 64-Bit Server VM (build 15.0.1+9-18, mixed mode, sharing) 复制代码
可以看到这个容器是有jdk环境的
退出当前容器:exit
然后再使用docker ps查看正在运行的容器是没有的。
-
守护式方式创建容器(创建成功之后不会自动登录容器,退出当前容器之后,容器也不会停止)
docker run -id --name=容器名称 镜像名称:标签 复制代码
登录守护式容器方式:
docker exec -it 容器名称(或者容器id) /bin/bash 复制代码
停止容器:
docker stop 容器名称(或者容器id)
复制代码
启动容器:
docker start 容器名称(或者容器id)
复制代码
3.文件拷贝
如果我们需要将文件拷贝到容器内可以使用cp命令
docker cp 需要拷贝的文件或目录 容器名称:容器目录
复制代码
将文件从容器内拷贝出来
docker cp 容器名称:容器目录 需要拷贝的文件或目录
复制代码
4.目录挂载
创建容器的时候,将宿主机的目录与容器内的目录进行映射,这样我们就可以通过修改宿主机某个目录的文件从而去影响容器。
创建容器 添加-v参数 宿主机目录:容器目录 如:
docker run -id -v /user/local/static:/usr/local/static --name=centos1 centos:latest
复制代码
如果出现权限不足的问题,我们需要添加参数 --privileged=true来解决
5.查看容器ip地址
我们可以通过以下命令查看容器运行的各种数据
docker inspect 容器名称(容器id)
复制代码
数据太多,可以过滤以下
docker inspect --format=`{{.NetworkSettings.IPAddress}}` 容器名称(id)
复制代码
删除容器
docker rm 容器名称(容器id)
复制代码
6. 查看日志
docker logs [OPTIONS] CONTAINER
Options:
--details 显示更多的信息
-f, --follow 跟踪实时日志
--since string 显示自某个timestamp之后的日志,或相对时间,如42m(即42分钟)
--tail string 从日志末尾显示多少行日志, 默认是all
-t, --timestamps 显示时间戳
--until string 显示自某个timestamp之前的日志,或相对时间,如42m(即42分钟)
复制代码
查看最近30分钟的日志:
docker logs --since 30m CONTAINER_ID
复制代码
查看某时间之后的日志:
docker logs -t --since="2021-01-13T13:23:37" CONTAINER_ID
复制代码
查看指定时间后的日志,只显示最后100行:
docker logs -f -t --since="2021-01-13" --tail=100 CONTAINER_ID
复制代码
查看某时间段日志:
docker logs -t --since="2021-01-12T13:23:37" --until "2021-01-13T12:23:37" CONTAINER_ID
复制代码
查看实时日志
docker logs -f -t --since="2021-01-12" --tail=10 CONTAINER_ID
复制代码
三. 常用容器部署
1. mysql容器部署
-
拉取mysql镜像
docker pull centos/mysql-57-centos7 复制代码
-
创建容器
docker run -id --name=tensquare_mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql 复制代码
-p表示端口映射,前面的是宿主机端口,后面的是容器运行端口
-e表示添加环境变量 MYSQL_ROOT_PASSWORD是root用户的登录密码
-
进入mysql容器
docker exec -it tensquare_mysql /bin/bash 复制代码
-
登录mysql
mysql -u root -p 复制代码
-
远程登录mysql
连接宿主机的ip,指定端口为3306
2. Tomcat部署
-
拉取镜像
docker pull tomcat:7-jre7 复制代码
-
创建容器
docker run -id --name=mytomcat -p 9000:8080 -v /usr/local/webapps:/usr/local/tomcat/wbeapps tomcat:7-jre7 复制代码
3. Nginx部署
-
拉取镜像
docker pull nginx 复制代码
-
创建容器
docker run -d --net host -p 80:80 --name nginx-web \ -v /home/nginx/www:/usr/share/nginx/html \ -v /home/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \ -v /home/nginx/logs:/var/log/nginx \ -v /www/wwwroot/blog:/www/wwwroot/blog \ nginx 复制代码
4. Redis部署
-
拉取镜像
docker pull redis 复制代码
-
创建容器
docker run -id --name=myredis -p 6379:6379 redis 复制代码
5. 迁移与备份
我们可以通过以下命令将容器保存为镜像
docker commit mynginx mynginx_image
复制代码
我们可以通过以下命令将镜像保存为tar文件
docker save -o mynginx.tar mynginx_image
复制代码
镜像恢复与迁移
我们先删除存在的mynginx镜像,然后执行下面的命令恢复
docker load -i mynginx.tar
复制代码
四. 编写Dockerfile制作镜像
Dockerfiel是由一系列命令和参数构成的脚本(可以看成是shell脚本),这些命令基于基础镜像并最终创建一个新的镜像
常用命令:
命令 | 作用 |
---|---|
FROM image_name:tag | 定义了使用哪个基础镜像启动构建流程 |
MAINTAINER user_name | 声明镜像的创建者 |
ENV key value | 设置环境变量 可以多条 |
RUN command | dpckerfile的核心部分 可以多条 |
ADD source_dir/file dest_dir/file | 将宿主机的文件复制到容器内,如果是压缩文件,会在复制后自动解压 |
COPY source_dir/file dest_dir/file | 和add相似,但是有压缩文件不会自动解压 |
WORKDIR path_dir | 设置工作目录 |
dockerfile构建jdk1.8镜像
FROM centos:7
MAINTAINER lingxiao
WORKDIR /usr
RUN mkdir /usr/local/java
ADD jdk-8u171-linux.tar.gz /usr/local/java/
ENV JAVA_HOME /usr/local/java/jdk1.8.0_171
ENV JRE_HOME $JAVA_HOME/jre
复制代码
私有仓库搭建与配置
-
拉取私有仓库镜像
docker pull registry 复制代码
-
启动私有仓库容器
docker run -id --name=registry -p 5000:5000 registry 复制代码
-
浏览器输入http://ipaddress:5000/v2/_catalog 看到
{"repositories": []}
表示私有仓库创建成功并且内容为空 -
修改daemon.json
vim /etc/docker/daemon.json 复制代码
添加已下内容,保存退出
{"insecure-registries":["ipaddress:5000"]} 复制代码
此步用于让docker信任私有仓库
-
重启docker
systemctl restart docker 复制代码
镜像上传至私有仓库
-
给镜像打上一个标记
docker tag jdk1.8 ipaddress:5000/jdk1.8 复制代码
-
上传标记的镜像
docker push ipaddress:5000/jdk1.8 复制代码
参考:
暂无评论