1.Docker介绍

1.1 Docker架构

Docker一文全解-LMLPHP

  • 镜像(image):就像是一个打包好的软件包。

  • 容器(container):镜像和容器的关系就像是Java里类和对象的关系。镜像是静态的定义,容器是运行的实体。容器可以被创建、启动、停止、删除、暂停。

  • 仓库(repository):仓库可以看成一个代码控制中心,用来保存各种镜像文件,你需要就从仓库去获取。

1.2 Docker核心

一种容器化的技术,把写好的代码和所需运行环境打包在一起作为一整个服务,后续部署直接用这一个服务就好了,解决软件跨环境迁移的问题。

Docker一文全解-LMLPHP

当你需要把所有东西部署到一台新的服务器上时,只需要运行一下这打包的整个服务,不需要一个个去部署安装。

2.Docker使用

2.1 Docker的安装

官网传送门

安装命令

#升级yum
sudo yum update  

#卸载旧版本
yum remove docker docker-common docker-selinux docker-engine  

#安装依赖  
yum install -y yum-utils device-mapper-persistent-data lvm2  

#设置源  
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo   

# 更新yum缓存
yum makecache fast

# 安装Docker
yum -y install docker-ce

# 启动
systemctl start docker

# 查看是否启动成功
docker info

# 开机自启
systemctl enable docker

# Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the d
systemctl restart docker  #重启一下就行

# 在下载镜像前,需要设置一下国内源,用来提高下载速度
sudo vim /etc/docker/daemon.json

# 配置
{  
    "registry-mirrors": ["https://d7grpode.mirror.aliyuncs.com"]  
}

# 重启
systemctl restart docker
2.2 Docker命令
docker服务相关命令
# 启动docker命令
systemctl start docker
 
# 停止docker命令
systemctl stop docker
 
# 查看docker服务状态
systemctl status docker
 
# 重启docker服务
systemctl restart docker
 
# 设置开机启动docker服务
systemctl enable docker
docker镜像相关命令
# 查看本地所有镜像
docker images
 
# 从网络中查找需要的镜像
docker search 镜像名称
 
# 从镜像仓库拉取镜像到本地
docker pull 镜像名称:TAG

其中TAG的版本可以从docker hub找
传送门
https://hub.docker.com/
 
# 删除镜像
docker rmi 镜像名称
docker容器相关命令
# 查看正在运行的容器
docker ps 
 
# 查看所有容器
docker ps -a
 
# 创建并启动容器
docker run 参数
 
参数说明:
- -i:保持容器运行。通常与-t同时使用。加入it这两个参数后,容器创建后自动进入容器,退出容器后,容器自动关闭
- -t:为容器重新分配一个伪输入终端。
- -d:以守护(后台)模式运行容器。
- --name:为创建的容器命名
 
# 进入容器
docker exec 参数 # 退出容器,容器不会关闭
 
# 停止容器
docker stop 容器名称
 
# 启动容器
docker start 容器名称
 
# 删除容器
docker rm 容器名称
 
# 查看容器信息
docker inspect 容器名称


# 设置容器开机自启
sudo docker update --restart=always <容器ID或名称>
# 关闭容器开机自启
sudo docker update --restart=no <容器ID或名称>

3.Docker容器数据卷

数据卷的概念:

  • 数据卷是宿主机中的一个目录或文件

  • 当容器目录和数据卷目录绑定后,对方的修改会立即同步

  • 一个数据卷可以被多个容器同时挂载

  • 一个容器也可以被挂在多个数据卷

数据卷的作用

  • 容器数据持久化

  • 外部机器和容器间接通信

  • 容器之间数据交换

简单来说:就是把容器中的数据挂载在一个地方,一般情况下是把数据卷设置在容量大的硬盘目录中。当容器坏了还是怎么了,你硬盘上的数据卷还在,你只需要重新创建一个容器挂载这个数据卷,数据就好了。

Docker一文全解-LMLPHP

 配置数据卷

# 创建启动容器时,使用 -v参数 设置数据卷
docker run ... -v 宿主机目录(文件):容器内目录(文件)
 
注意事项
1. 目录必须是绝对路径
2. 如果目录不存在,则会自动创建
3. 可以挂在多个数据卷 

4.Docker安装常用软件

Docker安装oracle11g
# 下载镜像
sudo docker pull registry.cn-hangzhou.aliyuncs.com/helowin/oracle_11g

# 查看镜像是否下载成功
sudo docker images

# 创建挂载文件
sudo mkdir -p /home/oracle/oradata

# 授权,不授权会导致后面安装失败
sudo chmod 777 /home/oracle/oradata

# 安装oracle
sudo docker run -d  \
-p 1521:1521 -p 5500:5500 \
-e ORACLE_SID=orcl \
-e ORACLE_EDITION=standard \
-e ORACLE_CHARACTERSET=AL32UTF8 \
-v /home/oracle/oradata:/opt/oracle/oradata \
--name oracle11g \
registry.cn-hangzhou.aliyuncs.com/helowin/oracle_11g

# 查看启动日志
sudo docker logs -ft oracle11g

# ORACLE设置
sudo docker exec -it oracle11g /bin/bash
su root
密码:helowin
ln -s $ORACLE_HOME/bin/sqlplus /usr/bin
su - oracle
sqlplus /nolog
conn /as sysdba

alter user system identified by system;
alter user sys identified by sys;
create user bw identified by 密码;
grant connect,resource,dba to 用户名; 
ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED;
alter system set processes=2000 scope=spfile;
select * from dba_users t where t.username = '用户名'; 

# 启动docker oracle命令
sudo docker start oracle11g
# 设置容器开机自启
sudo docker update --restart=always oracle11g
# 关闭容器开机自启
sudo docker update --restart=no <容器ID或名称>

Docker一文全解-LMLPHP

注意服务名是helowin

# 将数据文件放到容器中
sudo docker cp /home/xxx.dmp oracle11g:/opt/oracle/oradata/xxx.dmp

# 进入正在运行的Docker容器的命令行界面。使用以下命令:
sudo docker exec -it oracle11g bash
su root
密码:helowin
ln -s $ORACLE_HOME/bin/sqlplus /usr/bin
su - oracle
sqlplus /nolog
conn /as sysdba

# 使用命令行导入数据
# 查询已存在的数据泵目录:
SELECT directory_name FROM dba_directories;

# 导入文件
imp 用户名/密码@helowin file=/opt/oracle/oradata/xxx.dmp full=y ignore=n

# 导出数据
sudo docker exec -it oracle11g bash
su root
密码:helowin
su - oracle
exp 用户名/密码 owner=用户名 file=/opt/oracle/oradata/xxx.dmp log=/opt/oracle/oradata/xxx.log


# 可能会遇到表空间不足,可以看导出日志
# 错误信息
————————————————
EXP-00008: ORACLE error 29516 encountered
ORA-29516: Aurora assertion failure: Assertion failure at joez.c:3311
Bulk load of method java/lang/Object. failed; insufficient shm-object space
ORA-06512: at "SYS.DBMS_JAVA", line 139
EXP-00000: Export terminated unsuccessfully
————————————————

# 解决方法
SQL 执行 
alter system set java_jit_enabled=false
12-30 05:57