docker
1.docker基本概念
Docker是什么
Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。
项目部署的三个阶段
-
物理机
部署一个服务,会粗略估计服务所需要的机器性能,然后去采购对应的真实物理机器,然后在该机器上安装服务需要的一些软件,比如服务器Tomcat,数据库MySQL等等。
物理机时代缺点
1、部署非常慢:采购机器,安装系统,安装软件等等;
2、成本高以及资源浪费:通常为了以防服务性能不够,我们都会尽量采购比预期资源高一点的机器,不仅会增加成本,还会造成机器资源浪费;
3、难于扩展与迁移:由于是真实的物理机,扩展或者迁移会比较麻烦;
-
虚拟机
虚拟机能够在一台机器上创建多台机器,能够充分利用资源,并且也做到了机器之间的隔离,机器性能不够用了,也可以通过 Hypervisor 随时进行扩展。
虚拟机时代缺点
每一台虚拟机都要独立安装操作系统,大家知道操作系统其实也是比较占用性能的,有多少台虚拟机,我们就得多安装多少个操作系统,这样就浪费了很多资源。
-
容器化
可以把容器看做是不用安装操作系统的虚拟机,容器化技术比虚拟机更加灵活,更加小巧,更加极致的利用物理机资源。
Docker出现原因
-
一次构建,到处运行
通过 Docker 打包镜像发布测试,提供了一个标准化的解决方案,再也不用担心因为环境不一致而导致的服务部署问题。
-
更高效的计算资源利用
容器类似于 VM,但是它们具有被放宽的隔离属性,可以在应用程序之间共享操作系统(OS)。因此,容器被认为是轻量级的。容器与 VM 类似,具有自己的文件系统、CPU、内存、进程空间等。可以把容器看做是不用安装操作系统的虚拟机,容器化技术比虚拟机更加灵活,更加小巧,更加极致的利用物理机资源。
记住最重要的一点,Dokcer实际是宿主机的一个普通的进程,这也是Dokcer与传统虚拟化技术的最大不同。
Docker优点
-
部署快,开发测试更加敏捷
通过Docker 打包镜像发布测试,一键运行。
-
快速扩展机器
由于Docker容器快速启动特性,可以很快速的启动几十个、上百个容器来提供更多并发和资源利用率,并且这么多容器也有比较成熟的解决方案来统一管理,比如K8S。
-
提高系统利用率,降低硬件成本
轻量级的虚拟机,更省资源。
-
跨环境可移植
-
更好的支持微服务
微服务是近几年来IT圈内谈论比较多的一个名词,意义也很简单:尽可能细粒度拆分业务程序架构,由多个独立服务组成业务系统。
而Docker的容器设计原则:一个容器一个服务,容器之间相互隔离,和微服务正好遥相呼应。
-
应用运维标准化,支持不同语言系统
-
避免云厂商锁定
Docker学习网站
2.docker安装
在线安装
-
查看centos版本
[root@oracleflink ~]# cat /etc/centos-release CentOS Linux release 7.9.2009 (Core)
-
查看当前的内核版本
[root@oracleflink ~]# uname -r 3.10.0-1160.80.1.el7.x86_64
内核版本不是3.10及以上的需要升级,centos7升级内核方法
-
使用root权限更新yum包(非必须)
yum -y update
yum -y update:升级所有包同时也升级软件和系统内核
yum -y upgrade:只升级所有包,不升级软件和系统内核
注意:这个命令不是必须的,看个人情况,后面出现不兼容的情况的话就必须update了。
-
卸载旧版本(非必须)
yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine
-
安装需要的软件包
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-util 提供 yum-config-manager功能
device-mapper-persistent-data;lvm2是devicemapper驱动依赖
-
查看yum 仓库
[root@oracleflink ~]# ll /etc/yum.repos.d/ total 48 -rw-r--r--. 1 root root 1664 Nov 23 2020 CentOS-Base.repo -rw-r--r--. 1 root root 1309 Nov 23 2020 CentOS-CR.repo -rw-r--r--. 1 root root 649 Nov 23 2020 CentOS-Debuginfo.repo -rw-r--r--. 1 root root 314 Nov 23 2020 CentOS-fasttrack.repo -rw-r--r--. 1 root root 630 Nov 23 2020 CentOS-Media.repo -rw-r--r--. 1 root root 1331 Nov 23 2020 CentOS-Sources.repo -rw-r--r--. 1 root root 8515 Nov 23 2020 CentOS-Vault.repo -rw-r--r--. 1 root root 616 Nov 23 2020 CentOS-x86_64-kernel.repo -rw-r--r--. 1 root root 2081 Nov 15 11:13 docker-ce.repo -rw-r--r--. 1 root root 1946 Jul 10 19:08 elrepo.repo
如果用的厂商的服务器(阿里云、腾讯云)一般都会有docker仓库,如果用的是虚拟机或者公司的服务器基本s上没有。
-
设置docker,yum源
yum-config-manager --add-repo http://download.docker.com/linux/centos/docker-ce.repo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo yum-config-manager --add-repo https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo
上面两个地址三选一,Docker官方提供的Docker Registry镜像仓库是Docker Hub,但是国内访问这些服务可能比较慢,因此国内的一些云服务商提供了针对Docker Hub的镜像服务(Registry Mirror),这些镜像服务被称为加速器。使用加速器会直接从国内的地址下载Docker Hub的镜像。注意如果下载镜像较慢可以配置镜像加速服务 ,配置镜像加速
-
配置镜像加速(非必须)
[root@oracleflink ~]# cat /etc/docker/daemon.json { "registry-mirrors" : [ "https://docker.mirrors.ustc.edu.cn", "https://hub-mirror.c.163.com", "https://mirror.ccs.tencentyun.com", "https://registry.docker-cn.com" ] } # 修改配置后需要重启docker 服务 [root@oracleflink ~]# systemctl restart docker
常见的镜像加速器地址
- Docker 中国官方镜像 https://registry.docker-cn.com
- DaoCloud 镜像站 http://f1361db2.m.daocloud.io
- Azure 中国镜像 https://dockerhub.azk8s.cn
- 中科大镜像站 https://docker.mirrors.ustc.edu.cn
- 阿里云 https://<your_code>.mirror.aliyuncs.com
需要先在阿里云注册并登录,点击“创建我的容器镜像”, 进入管理界面,
然后点击“镜像加速器” ,可获得镜像加速器连接。 - 七牛云 https://reg-mirror.qiniu.com
- 网易云 https://hub-mirror.c.163.com
- 腾讯云 https://mirror.ccs.tencentyun.com
注意要启动docker后才有
/etc/docker
这个文件夹daemon.json
文件自己建 -
安装docker
yum install docker-ce docker-ce-cli containerd.io
docker-ce:docker 引擎,社区版
docker-ce-cli: docker 引擎的命令行界面,社区版
containerd.io:可用作 Linux 和 Windows 的守护程序。 它管理其主机系统的完整容器[生命周期],从图像传输和存储到容器执行和监督,再到低级存储到网络附件等等。
注意:默认执行
yum install docker-ce
就可以了,后面两个依赖不是必须的 -
启动docker
systemctl start docker
-
设置开机启动
systemctl enable docker
-
验证是否安装成功
docker info
离线安装
-
准备安装包
# 下载地址 https://download.docker.com/linux/static/stable/x86_64/docker-18.09.6.tgz
-
解压缩安装包
tar -zxvf docker-18.09.6.tgz
-
复制解压缩后的文件到指定文件夹
cp docker/* /usr/bin/
-
注册编辑docker服务
vi /etc/systemd/system/docker.service
-
复制下列内容到该文档中
[Unit] Description=Docker Application Container Engine Documentation=https://docs.docker.com After=network-online.target firewalld.service Wants=network-online.target [Service] Type=notify # the default is not to use systemd for cgroups because the delegate issues still # exists and systemd currently does not support the cgroup feature set required # for containers run by docker ExecStart=/usr/bin/dockerd ExecReload=/bin/kill -s HUP $MAINPID # Having non-zero Limit*s causes performance problems due to accounting overhead # in the kernel. We recommend using cgroups to do container-local accounting. LimitNOFILE=infinity LimitNPROC=infinity LimitCORE=infinity # Uncomment TasksMax if your systemd version supports it. # Only systemd 226 and above support this version. #TasksMax=infinity TimeoutStartSec=0 # set delegate yes so that systemd does not reset the cgroups of docker containers Delegate=yes # kill only the docker process, not all processes in the cgroup KillMode=process # restart the docker process if it exits prematurely Restart=on-failure StartLimitBurst=3 StartLimitInterval=60s [Install] WantedBy=multi-user.target
-
添加权限后启动
chmod +x /etc/systemd/system/docker.service
-
重新加载配置文件
systemctl daemon-reload
-
启动Docker
systemctl start docker
-
设置开机自启
systemctl enable docker.service
-
验证是否安装成功
# 查看docker 状态 systemctl status docker # 查看docker版本 docker -v
3.docker概念与执行流程
容器化平台
Docker 是提供应用打包,部署与运行应用的容器化平台。
Docker引擎
-
docker daemon
Docker的服务端组件,他是Docker架构中运行在后台的一个守护进程,可以接收并处理来自命令行接口及API接口的指令,然后进行相应的后台操作。
-
REST API
表示应用程序API接口,开发者通过该API接口可以与Docker的守护进程进行交互,从而指示后台进行相关操作。
-
docker CLI
表示Docker命令行接口,开发者可以在命令行中使用Docker相关指令与Docker守护进程进行交互,从而管理诸如image(镜像)、container(容器)、network(网络)和data volumes(数据卷)等实体。
容器,镜像,仓库
- 仓库存放镜像的地方
- 镜像可以类似Java中的类
- 容器类的实例化,对象
一个仓库可以存放多个镜像,一个镜像可以构建多个容器。
Docker执行流程
客户端发送
docker pull Tomcat
命令,命令到达 Docker daemon(守护程序),守护进程首先检查本地是否有该Tomcat
的镜像,如果没有,则从注册中心(仓库)拉取该镜像;镜像拉取到本地后,客户端执行docker run
命令,守护程序就会创建容器,启动应用。
docker pull 命令详解
Docker Pull 命令是用来从 Docker 镜像仓库中拉取一个或多个镜像到本地主机的命令。执行 Docker Pull 命令后,Docker 客户端会首先检查本地主机是否已经存在该镜像,如果已经存在则直接使用本地的镜像,否则会从 Docker 镜像仓库中拉取对应的镜像。下面是 Docker Pull 命令的详细流程:
-
解析镜像名称和标签
Docker Pull 命令需要提供要拉取的镜像名称和标签(tag),例如
docker pull nginx:latest
。Docker 客户端会对这个名称进行解析,确定镜像所在的 Docker 镜像仓库地址、仓库名称和标签。 -
认证 Docker 镜像仓库
如果需要认证 Docker 镜像仓库,Docker 客户端会提示用户输入用户名和密码或者其他认证信息,以便向 Docker 镜像仓库发起认证请求。
-
检查本地主机是否已有该镜像
Docker 客户端会检查本地主机是否已经存在该镜像。如果本地主机已经有了该镜像,Docker 客户端会直接使用本地的镜像,否则会从 Docker 镜像仓库中拉取对应的镜像。
-
从 Docker 镜像仓库中拉取镜像
如果本地主机没有该镜像,Docker 客户端会向 Docker 镜像仓库发起拉取镜像的请求。Docker 镜像仓库会返回该镜像的所有层(layers),Docker 客户端会将这些层下载到本地主机,并根据层的依赖关系进行组装,最终生成完整的镜像。
-
保存镜像到本地主机
Docker 客户端会将拉取到的镜像保存到本地主机的 Docker 镜像缓存中,以便后续使用。Docker 镜像缓存一般位于
/var/lib/docker
目录下,其中的image
目录存储了所有已经拉取到本地主机的镜像。 -
更新本地镜像索引
Docker 客户端会更新本地镜像索引(image index),以便在后续使用
docker run
命令时能够快速地找到该镜像。本地镜像索引一般位于/var/lib/docker/image/docker/registry/v2/repositories
目录下。
总的来说,Docker Pull 命令的主要作用是从 Docker 镜像仓库中拉取镜像并保存到本地主机,以便在后续使用 docker run
命令时能够快速地启动容器。
4.docker常用命令
万能帮助命令
-
docker --help
-
docker 命令 --help
[root@oracleflink ~]# docker run --help Usage: docker run [OPTIONS] IMAGE [COMMAND] [ARG...] Run a command in a new container .....
常用命令
-
查看版本信息
[root@oracleflink ~]# docker version Client: Docker Engine - Community Version: 20.10.21 API version: 1.41 Go version: go1.18.7 Git commit: baeda1f Built: Tue Oct 25 18:04:24 2022 OS/Arch: linux/amd64 Context: default Experimental: true Server: Docker Engine - Community Engine: Version: 20.10.21 API version: 1.41 (minimum version 1.12) Go version: go1.18.7 Git commit: 3056208 Built: Tue Oct 25 18:02:38 2022 OS/Arch: linux/amd64 Experimental: false containerd: Version: 1.6.9 GitCommit: 1c90a442489720eec95342e1789ee8a5e1b9536f runc: Version: 1.1.4 GitCommit: v1.1.4-0-g5fd4c4d docker-init: Version: 0.19.0 GitCommit: de40ad0
-
查看系统信息
docker info
镜像常用命令
-
查看镜像
[root@oracleflink ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE mcr.microsoft.com/mssql/server 2017-latest a03c94c3147d 2 months ago 1.33GB registry.cn-hangzhou.aliyuncs.com/lhrbest/oracle_12cr2_ee_lhr_12.2.0.1 2.0 eb1a87913afe 2 years ago 16.1GB registry.cn-hangzhou.aliyuncs.com/zhuyijun/oracle-12c latest 2963f42e27a2 2 years ago 6.01GB registry.cn-hangzhou.aliyuncs.com/helowin/oracle_11g latest 3fa112fd3642 6 years ago 6.85GB
REPOSITORY: 镜像仓库源
TAG:镜像版本,latest 表示最新版本
IMAGE ID:镜像ID(特别重要)
CREATED:创建时间
SIZE:镜像大小。
-
搜索镜像
[root@oracleflink ~]# docker search docker NAME DESCRIPTION STARS OFFICIAL AUTOMATED nginx Official build of Nginx. 17721 [OK] ubuntu Ubuntu is a Debian-based Linux operating sys… 15255 [OK] mysql MySQL is a widely used, open-source relation… 13504 [OK] node Node.js is a JavaScript-based platform for s… 12133 [OK] postgres The PostgreSQL object-relational database sy… 11693 [OK] redis Redis is an open source key-value store that… 11590 [OK] alpine A minimal Docker image based on Alpine Linux… 9450 [OK] mongo MongoDB document databases provide high avai… 9283 [OK] python Python is an interpreted, interactive, objec… 8164 [OK] centos DEPRECATED; The official build of CentOS. 7408 [OK] mariadb MariaDB Server is a high performing open sou… 5155 [OK] wordpress The WordPress rich content management system… 5001 [OK] rabbitmq RabbitMQ is an open source multi-protocol me… 4560 [OK] debian Debian is a Linux distribution that's compos… 4504 [OK] golang Go (golang) is a general purpose, higher-lev… 4356 [OK] httpd The Apache HTTP Server Project 4247 [OK] registry The Docker Registry 2.0 implementation for s… 3721 [OK] openjdk Pre-release / non-production builds of OpenJ… 3495 [OK] busybox Busybox base image. 2822 [OK] traefik Traefik, The Cloud Native Edge Router 2726 [OK] docker Docker in Docker! 2116 [OK] memcached Free & open source, high-performance, distri… 1971 [OK] hello-world Hello World! (an example of minimal Dockeriz… 1906 [OK] influxdb InfluxDB is an open source time series datab… 1651 [OK] consul Consul is a datacenter runtime that provides… 1355 [OK]
docker search <镜像名>
NAME:镜像名称
DESCRIPTION:镜像描述
STARS:收藏数
OFFICIAL:是否官方
AUTOMATED:是否自动构建
也可以直接进入 docker hub网站直接搜索
-
下载镜像
docker pull 镜像名<:tags>
如果不指定tags,默认下载最新版
-
删除镜像
docker rmi repository<:tag> # 根据名称和版本删除,如果不指定tag,默认是lastest docker rmi IMAGE_ID # 根据镜像id删除 docker rmi IMAGE_ID1 IMAGE_ID2 ... # 批量删除
容器常用命令
-
新建容器并启动
docker run <参数> 镜像id|镜像名称 docker run -d --restart=always --privileged=true -p 1522:1522 -p 5501:5501 --name oracle11g -v /oracle11g/oradata:/oracle11g/oradata registry.cn-hangzhou.aliyuncs.com/helowin/oracle_11g
常用参数说明
docker run [OPTIONS] IMAGE[:TAG] [COMMAND] [ARG...] -d, --detach=false 指定容器运行于前台还是后台,默认为false -i, --interactive=false 打开STDIN,用于控制台交互 -t, --tty=false 分配tty设备,该可以支持终端登录,默认为false -u, --user="" 指定容器的用户 -a, --attach=[] 登录容器(必须是以docker run -d启动的容器) -w, --workdir="" 指定容器的工作目录 -c, --cpu-shares=0 设置容器CPU权重,在CPU共享场景使用 -e, --env=[] 指定环境变量,容器中可以使用该环境变量 -m, --memory="" 指定容器的内存上限 -P, --publish-all=false 指定容器暴露的端口 -p, --publish=[] 指定容器暴露的端口 -h, --hostname="" 指定容器的主机名 -v, --volume=[] 给容器挂载存储卷,挂载到容器的某个目录 --volumes-from=[] 给容器挂载其他容器上的卷,挂载到容器的某个目录 --cap-add=[] 添加权限 --cap-drop=[] 删除权限 --cidfile="" 运行容器后,在指定文件中写入容器PID值,一种典型的监控系统用法 --cpuset="" 设置容器可以使用哪些CPU,此参数可以用来容器独占CPU --device=[] 添加主机设备给容器,相当于设备直通 --dns=[] 指定容器的dns服务器 --dns-search=[] 指定容器的dns搜索域名,写入到容器的/etc/resolv.conf文件 --entrypoint="" 覆盖image的入口点 --env-file=[] 指定环境变量文件,文件格式为每行一个环境变量 --expose=[] 指定容器暴露的端口,即修改镜像的暴露端口 --link=[] 指定容器间的关联,使用其他容器的IP、env等信息 --lxc-conf=[] 指定容器的配置文件,只有在指定--exec-driver=lxc时使用 --name="" 指定容器名字,后续可以通过名字进行容器管理,links特性需要使用名字 --net="bridge" 容器网络设置: bridge 使用docker daemon指定的网桥 host //容器使用主机的网络 container:NAME_or_ID >//使用其他容器的网络,共享IP和PORT等网络资源 none 容器使用自己的网络(类似--net=bridge),但是不进行配置 --privileged=false 指定容器是否为特权容器,特权容器拥有所有的capabilities --restart="no" 指定容器停止后的重启策略: no:容器退出时不重启 on-failure:容器故障退出(返回值非零)时重启 always:容器退出时总是重启 --rm=false 指定容器停止后自动删除容器(不支持以docker run -d启动的容器) --sig-proxy=true 设置由代理接受并处理信号,但是SIGCHLD、SIGSTOP和SIGKILL不能被代理
-
进入容器
# 方法一 使用run方式在创建时进入 docker run -it [镜像id|镜像名] /bin/bash # 方法二 使用 attach 命令(进入已启动的容器) docker attach --sig-proxy=false 容器名称|容器ID # 方法三 使用 exec 命令(进入已启动的容器)一般使用这个方法 docker exec -it 容器名称|容器ID /bin/bash
-
退出容器
# 方法一 Ctrl+P+Q : 仅退出容器,不关闭容器 # 方法二 exit: 关闭容器并退出。 # 方法三 ctr + d :同方法二,方法二的快捷方式
-
查看所有运行的容器
1、查看正在运行的容器 docker ps 2、查看正在运行的容器的ID docker ps -q 3、查看正在运行+历史运行过的容器 docker ps -a 4、显示运行容器总文件大小 docker ps -s
-
停止与删除容器
# 1.停止一个运行中的容器 docker stop 容器名|容器id # 2.杀掉一个运行中的容器 docker kill 容器名|容器id # 3.删除一个已停止的容器 docker rm 容器名|容器id # 4.删除一个运行中的容器 docker rm -f 容器名|容器id
-
查看容器日志
docker logs <参数>容器名|容器id
参数:
-f 跟踪日志输出
-t:显示时间戳
–tail N:仅列出最后N条日志
-
查看容器进程
docker top 容器ID|容器名
-
查看容器信息
docker inspect 容器ID|容器名
-
主机和容器之间数据复制
# 将容器中的文件copy至本地路径 docker cp 容器名|容器ID:/[container_path] [local_path] docker cp /www/runoob 96f7f14e99ab:/www/ # 将主机文件copy至容器 docker cp [local_path] 容器名|容器ID:/[container_path] # 将主机文件copy至容器,目录重命名为[container_path](注意与非重命名copy的区别) docker cp /www/runoob 96f7f14e99ab:/www
5.docker file
docker file概念
Dockerfile是自动构建docker镜像的配置文件,将镜像构建过程通过指令的方式定义在Dockerfile中。配合docker build
命令行可以实现自动化的Docker镜像的构建。
docke filr 编写规范
- 每条指令(每行开头关键字)都必须是大写字母
- 执行顺序是按照编写顺序从上到下
- # 表示注释
Dockerfile指令详解
-
FROM- 镜像从那里来
-
MAINTAINER- 镜像维护者信息
-
RUN- 构建镜像执行的命令,每一次RUN都会构建一层
-
CMD- 容器启动的命令,如果有多个则以最后一个为准,也可以为ENTRYPOINT提供参数
-
VOLUME- 定义数据卷,如果没有定义则使用默认
-
USER- 指定后续执行的用户组和用户
-
WORKDIR- 切换当前执行的工作目录
-
HEALTHCHECH- 健康检测指令
-
ARG- 变量属性值,但不在容器内部起作用
-
EXPOSE- 暴露端口
-
ENV- 变量属性值,容器内部也会起作用
-
ADD- 添加文件,如果是压缩文件也解压
-
COPY- 添加文件,以复制的形式
-
ENTRYPOINT- 容器进入时执行的命令
Dockerfile参考资料
6.容器间通信
容器间通信方式
-
利用容器ip访问
容器重启后,ip会发生变化。通过容器ip访问不是一个好的方案。
-
利用宿主机的“ip:port”访问
通过宿主机的ip:port访问,只能依靠监听在暴露出的端口的进程来进行有限的通信。
-
利用link建立连接进行通信(官方不推荐使用)
-
利用“User-defined networks”进行通信(官方推荐使用)
7.容器间数据共享
数据共享三种方式
-
Bind Mounts方式共享数据
docker run -it -v /home/webapps:/usr/local/tomcat/webapps -p 8083:8080 --name tomcat03 tomcat:latest /bin/bash
执行命令
docker run -it -v 宿主机目录:容器目录
-
Volumes方式数据共享
-
Volume container(数据卷容器)方式,(共享容器)
-
宿主机创建目录
我们在 /home 下创建 /share_volume 目录,然后在这个目录下新建 index.html 文件,里面就一句 hello docker!!!。
-
创建共享容器
docker create --name tomcat_share -v /home/share_volume:/usr/local/tomcat/webapps tomcat:latest /bin/true
-
创建实际容器
docker run -d -p 8081:8080 --volumes-from tomcat_share --name tomcat01 -d tomcat docker run -d -p 8082:8080 --volumes-from tomcat_share --name tomcat02 -d tomcat
上面启动了两个容器,会发现更改宿主机的/home/share_volume 目录内容,两个容器的/usr/local/tomcat/webapps 目录内容都会改变。
-
8.docker compose
Docker Compose概念
Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,您可以使用 YML 文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以从 YML 文件配置中创建并启动所有服务。
出现原因
在实际的生产中,一般都是使用一个docker容器部署一个应用进程,这种情况下,当部署多个不同应用或者一个应用部署多个实例的时候,就要运行多个容器。多个容器协同工作需要一个管理者来管理他们,定义这些容器如何相互关联。compose 就是做这件事的。
Docker Compose的主要作用是帮助我们批量有规则的管理容器。
参考资料
9.docker 安装常见数据库
docker 安装oracle11g
-
创建数据共享目录
mkdir -p /oracle11g/oradata && chmod 777 /oracle11g/oradata
-
拉取镜像
docker pull registry.cn-hangzhou.aliyuncs.com/helowin/oracle_11g
-
创建容器
docker run -d --restart=always --privileged=true -p 1522:1522 -p 5501:5501 --name oracle11g -v /oracle11g/oradata:/oracle11g/oradata registry.cn-hangzhou.aliyuncs.com/helowin/oracle_11g
注意这里的暴露端口为1522,与oralce默认监听端口1521不一致,需要进入容器修改oracle默认监听端口,注意在容器内修改端口,只需要更改端口
PORT
,不需要更改HOST
-
查看oracle11g容器是否创建成功
docker ps -a
-
进入镜像镜像进行配置
docker exec -it oracle11g /bin/bash
-
切换到root下进行配置
su root (密码:helowin)
-
编辑profile文件配置ORACLE环境变量
vi /etc/profile # 添加: export ORACLE_HOME=/home/oracle/app/oracle/product/11.2.0/dbhome_2 export ORACLE_SID=helowin export PATH=$ORACLE_HOME/bin:$PATH # 环境生效 source /etc/profile
-
创建软连接
ln -s $ORACLE_HOME/bin/sqlplus /usr/bin
-
切换到oracle 用户
su - oracle
-
登录sqlplus并修改sys、system用户密码
sqlplus /nolog conn /as sysdba
-
修改sys、system用户密码并刷新权限
alter user system identified by 123456; alter user sys identified by 123456; # 设置密码生效策略 ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED; exit
-
查看oracle实例
[oracle@177c1d8c514a ~]$ lsnrctl status [oracle@177c1d8c514a ~]$ exit
-
用nacivat连接oracle数据库
服务名:helowin(一定要填写helowin) 用户名:system 密码:123456(第10步设置的密码)
docker 安装oracle12c
-
创建数据共享目录
mkdir -p /home/nicemoe/oradata && chmod 777 /home/nicemoe/oradata
-
拉取镜像
docker pull registry.cn-hangzhou.aliyuncs.com/zhuyijun/oracle-12c
-
启动容器
docker run -d --restart=always --privileged=true --name myoracle -p 1521:1521 -p 5500:5500 -e ORACLE_SID=ORCLCDB -e ORACLE_PDB=orclpdb1 -e ORACLE_PWD=123456 -e ORACLE_CHARACTERSET=zhs16gbk -e ORACLE_BASE=/opt/oracle -e ORACLE_HOME=/opt/oracle/product/12.2.0.1/dbhome_1 -e PATH=/opt/oracle/product/12.2.0.1/dbhome_1/bin:/opt/oracle/product/12.2.0.1/dbhome_1/OPatch/:/usr/sbin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin -v /home/nicemoe/oradata:/opt/oracle/oradata registry.cn-hangzhou.aliyuncs.com/zhuyijun/oracle-12c:latest
-
修改密码
docker exec <container name> ./setPassword.sh <your password> 例如: docker exec a5f5a90ec826 ./setPassword.sh 123456
注意要在容器启动后在执行,不然报错。
-
登录数据库
-
参考资料
docker 安装sqlserver2017
-
创建数据共享目录
mkdir -p /sqlserver2017/sqlserver-data && chmod 777 /sqlserver2017/sqlserver-data
-
拉取镜像
docker pull mcr.microsoft.com/mssql/server:2017-latest
-
启动容器
docker run -e "ACCEPT_EULA=Y" -e "SA_PASSWORD=qwe20211114." -p 1433:1433 --name sqlserver2017 -d --restart=always --privileged=true -v /sqlserver2017/sqlserver-data:/sqlserver2017/sqlserver-data mcr.microsoft.com/mssql/server:2017-latest
注意这个SA_PASSWORD必须要是强密码,不然不通过
保证安装内存2G及以上
-
进入容器
# 1.进入容器 docker exec -it sqlserver2017 /bin/bash # 2.登录数据库 /opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P "qwe20211114." # 3.查询数据库 select name from sys.Databases go # 4.创建数据库 create database flinktest go
-
远程连接
-
参考资料