docker 笔记
整理一下 docker 的笔记。内容不多,便于速查。
docker 只是容器,并非虚拟机,很大程度上还得依赖宿主OS。
比如:镜像 microsoft/dotnet-framework就不能在Linux下运行,拉取时会有相应的提示。
相对来说,运行在Linux环境则稳定/高效,对Windows环境不太好。并且Windows需要开启 vt-x 或AMD-v 指令才能使用。
1. 安装 (centos 7)
# 1. 检查有无安装docker yum list installed |grep docker # 2. 安装依赖 yum install -y yum-utils device-mapper-persistent-data lvm2 # 3. 添加软件源信息 yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo # 4. 更新 yum 缓存 yum makecache fast # 5. 安装docker yum -y install docker-ce # 6. 启动 systemctl start docker
systemctl enable docker # 设为开机启动 # 7. 检查进程 ps -ef |grep docker # 鉴于国内网络问题,后续拉取 Docker 镜像缓慢,需要配置加速器,使用网易的镜像地址:http://hub-mirror.c.163.com # 新版的 Docker 使用 /etc/docker/daemon.json(Linux)或者 %programdata%\docker\config\daemon.json(Windows)来配置 # 在配置文件中加入(没有该文件的话,先建一个): data-root可以用来指定镜像/容器等的存储位置
{ "registry-mirrors": ["http://hub-mirror.c.163.com"],
"data-root": "/data/docker-data",
"storage-driver": "overlay2"
}
# 如果要使用代理访问docker外网仓库,需要专门配置代理文件
# 新建目录和文件/etc/systemd/system/docker.service.d/http-proxy.conf
# 在文件中添加以下内容,主要是确定PROXY地址端口正确。
[Service] Environment="HTTPS_PROXY=http://ip:port" Environment="HTTP_PROXY=http://ip:port" Environment="NO_PROXY=localhost,127.0.0.1"
# 然后 重新载入配置
systemctl stop docker systemctl daemon-reload systemctl start docker docker info systemctl show --property=Environment docker
# 如果要删除 Docker CE yum remove docker-ce rm -rf /var/lib/docker # 就是删除存储目录
2. 容器与镜像
## 容器与镜像的关系,好比编程中“对象”与“类”的关系 # ------------------------ docker cmd ---------------------------------- # 内部命令很多情况下,操作ID或NAMES都是一样的 docker # 获取帮助 docker run hello-world # 拉取并启动镜像 docker image ls # 本地镜像 docker images # 本地镜像 docker pull training/webapp # 拉取某镜像 docker search redis # 搜索镜像 OFFICIAL [OK] 为官方版本 docker pull ubuntu:13.10 # pull 或 run 也可以指定TAG版本 # 使用镜像创建容器 docker run -d -P training/webapp python app.py # -d:让容器在后台运行。 # -P:将容器内部网络端口映射到主机随机端口上 docker ps # 是否有容器在运行 # PORTS 0.0.0.0:32768->5000/tcp 表示外部32768映射到容器内5000端口 # 也可以通过 -p 参数来指定IP和端口 docker run -d -p 5000:5000 training/webapp python app.py docker run -d -p 127.0.0.1:5000:5000 training/webapp python app.py # 随机生成容器名称。也可以 --name 指定名称 docker run -d -p 6379:6379 --name my_redis redis # 可通过ID或名称查看端口 docker port 98a243b215c7 docker port determined_bhabha docker logs -f 98a243b215c7 # 应用程序日志 docker top 98a243b215c7 # 容器的进程 docker inspect determined_bhabha # 容器配置和状态 docker stop determined_bhabha # 停止应用容器 docker stop 98a243b215c7 # 或 docker ps -l # 查询最后一次创建的容器 docker start 98a243b215c7 # 再次启动容器 docker restart 98a243b215c7 # 重启容器 docker rm 98a243b215c7 # 删除容器 必须先stop docker rmi 6fae60ef3446 # 删镜像 必先删对应容器,且只能用ID
3. 几个应用示例:
##------------------------ docker redis -------------------------------- docker search redis docker pull redis:3.2 docker images docker run -p 6379:6379 -v /rdsdata:/data -d redis:3.2 redis-server --appendonly yes # -v /rdsdata:/data : 将主机中/rdsdata挂载到容器的/data # redis-server --appendonly yes : 在容器执行redis-server启动命令,并打开redis持久化配置 docker exec -it 6aa89bf8343a redis-cli # 进入redis cli > info > CONFIG GET * ##------------------------ docker nginx -------------------------------- # 1. 拉取并测试启动 docker pull nginx docker run --name dk_nginx -p 80:80 -d nginx # 2. 创建映射目录 mkdir -p /nxdata/logs /nxdata/conf /nxdata/www # www: 目录将映射为 nginx 容器配置的虚拟目录。 # logs: 目录将映射为 nginx 容器的日志目录。 # conf: 目录里的配置文件将映射为 nginx 容器的配置文件。 # 3. 编辑并保存配置文件 docker ps docker cp dk_nginx:/etc/nginx/nginx.conf /nxdata/conf/ # 拷贝容器内 Nginx 默认配置文件到本地的 conf 目录, 编辑内容如下: user nginx; worker_processes 1; error_log /var/log/nginx/error.log warn; pid /var/run/nginx.pid; events { worker_connections 1024; } http { include /etc/nginx/mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; sendfile on; #tcp_nopush on; keepalive_timeout 65; #gzip on; include /etc/nginx/conf.d/*.conf; } # 4. 重新部署 docker stop dk_nginx docker rm dk_nginx # 停止并删除旧容器 docker run -d -p 80:80 --name mynginx -v /nxdata/www:/usr/share/nginx/html \ -v /nxdata/conf/nginx.conf:/etc/nginx/nginx.conf \ -v /nxdata/logs:/var/log/nginx nginx # -v /nxdata/www:/usr/share/nginx/html 将创建的 www 目录挂载到容器的 /usr/share/nginx/html # -v /nxdata/conf/nginx.conf:/etc/nginx/nginx.conf 将创建的 nginx.conf 挂载到容器的 /etc/nginx/nginx.conf # -v /nxdata/logs:/var/log/nginx 将创建的 logs 挂载到容器的 /var/log/nginx # 5. 在 /nxdata/www 下放入index.html文件后,浏览器访问测试 docker kill -s HUP mynginx # 重新载入 nginx (STATUS 不变) docker restart mynginx # 重启 NGINX 容器 (STATUS 重新开始) # ------------------------- docker php --------------------------------- # 1. 拉取镜像 docker pull php:5.6-fpm # 2. 先启动 php-fpm docker run --name myphp -d -v /nxdata/www:/var/www/html:ro php:5.6-fpm # /nxdata/www是本地 php 文件的存储目录,/var/www/html是容器内 php文件目录,ro 表只读 # 3. 添加本地配置文件/nxdata/conf/conf.d/default.conf 内容如下: server { listen 80; server_name localhost; location / { root /usr/share/nginx/html; index index.html index.htm index.php; } error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } location ~ \.php$ { fastcgi_pass php:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /var/www/html/$fastcgi_script_name; include fastcgi_params; } } # 4. 启动nginx并连接PHP docker run --name mynginx -p 81:80 -d \ -v /nxdata/www:/usr/share/nginx/html:ro \ -v /nxdata/conf/conf.d:/etc/nginx/conf.d:ro \ --link myphp:php nginx # --link myphp:php 把 myphp 的网络并入mynginx , 并通过修改 mynginx 的 /etc/hosts,把域名 php 映射成 127.0.0.1,让 nginx 通过 php:9000 访问 php-fpm # 5. 添加/nxdata/www/index.php文件并测试访问 http://host:81/ <?php phpinfo(); # ------------------------- docker mariadb ------------------------------- docker pull mariadb:5.5.64 # TAG可以在hub.docker.com中点击项目后查看 # 1. 创建本地映射目录 mkdir -p /nxdata/mariadb/data /nxdata/mariadb/logs /nxdata/mariadb/conf # 2. 配置文件 /nxdata/mariadb/conf/my.cnf [mysqld] datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock symbolic-links=0 innodb_file_per_table=1 innodb_buffer_pool_size = 1G [mysqld_safe] log-error=/var/log/mariadb/mariadb.log pid-file=/var/run/mariadb/mariadb.pid !includedir /etc/my.cnf.d # 3. 启动容器 docker run -p 3306:3306 --name maria -v /nxdata/mariadb/conf:/etc/mysql/conf.d \ -v /nxdata/mariadb/logs:/logs -v /nxdata/mariadb/data:/data \ -e MYSQL_ROOT_PASSWORD=123456 -d --link myphp mariadb:5.5.64 # -v /nxdata/mariadb/conf:/etc/mysql/conf.d 挂载配置文件(容器中路径不对则不生效) # -e MYSQL_ROOT_PASSWORD=123456 初始化 root 用户的密码 # 4. 使用cli连接 也可以使用工具连接(如Navicat) docker run -it --link maria:mariadb mariadb:5.5.64 sh -c 'exec mysql -hmaria -P3306 -uroot -p123456' # --link 连接到容器maria并命名为mariadb 后跟镜像名 # sh -c 用来执行命令 # 测试SQL命令:show variables like '%per_table%'; show databases; # 如果需要,也可以安装使用 phpmyadmin docker run --name myadmin -d --link maria:db -p 82:80 phpmyadmin/phpmyadmin # 测试访问 http://host:82/ # ------------------------ docker mongodb ------------------------------ docker search mongo docker pull mongo # 目录如果没有会自动创建 docker run -p 27017:27017 -v /nxdata/mongodb:/data/db -d mongo docker run -it mongo mongo --host 172.17.0.1 # shell
# ---------------------------- onlyoffice ----------------------------- docker run -i -t -d -p8000:80 --restart=always onlyoffice/documentserver -i 以交互模式运行容器,通常与 -t 同时使用; -t 为容器重新分配一个伪输入终端,通常与 -i 同时使用; -d 后台运行容器,并返回容器ID; --restart=always 当 docker 重启时,容器自动启动。 # 更换服务器,镜像的导出导入: docker images # 查看镜像 docker save 61f7051ea308 > /opt/onlyoffice.tar # 导出镜像 scp onlyoffice.tar 192.168.6.12:/opt/ # 远程拷贝
docker load < /opt/onlyoffice.tar # 新机器载入
docker images # 查看镜像id
docker tag 61f7051ea308 onlyoffice/documentserver:latest # 修改名称和tag
docker run -i -t -d -p8000:80 --restart=always onlyoffice/documentserver # 运行
ORACLE
#------------------------------- docker oracle11g -------------------------------- # https://blog.csdn.net/qq_38380025/article/details/80647620 docker pull registry.cn-hangzhou.aliyuncs.com/helowin/oracle_11g docker run -d -p 1521:1521 --name oracle11g registry.cn-hangzhou.aliyuncs.com/helowin/oracle_11g docker start oracle11g # 进入镜像 shell 进行配置 docker exec -it oracle11g bash su root # 密码:helowin # 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 export LANG=zh_CN.UTF-8 export NLS_LANG="SIMPLIFIED CHINESE_CHINA".ZHS16GBK source /etc/profile ln -s $ORACLE_HOME/bin/sqlplus /usr/bin # 编辑此文件,添加以下内容: vi /home/oracle/app/oracle/product/11.2.0/dbhome_2/network/admin/tnsnames.ora docker_oracle11 = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT =1521)) ) (CONNECT_DATA = (SERVICE_NAME = helowinXDB) ) ) su - oracle # 中间的 - 不能少 sqlplus /nolog conn /as sysdba alter user system identified by system; alter user sys identified by sys; # 也可以创建用户 create user test identified by test; # 并给用户赋予权限 grant connect,resource,dba to test; # 当执行修改密码的时候出现 : database not open # 输入:alter database open; # 也许还会提示 : ORA-01507: database not mounted # 输入: alter databasemount; # 输入: alter database open; # 然后就可执行 修改数据库密码的命令了 # 改完之后输入:ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED; # 刷新下表 # 更改编码,支持中文 # 注意,一定要事先备份数据。 select userenv('language') from dual; # select * from nls_database_parameters where parameter in ('NLS_CHARCTERSET','NLS_NCHAR_CHARACTERSET'); SELECT parameter, value FROM v$nls_parameters WHERE parameter LIKE '%CHARACTERSET'; shutdown immediate; startup; alter session set sql_trace=true; alter system enable restricted session; show parameter job_queue_processes; alter system set job_queue_processes=0; alter system set aq_tm_processes=0; alter database character set INTERNAL_USE ZHS16GBK; update props$ set VALUE$='ZHS16GBK' where NAME='NLS_NCHAR_CHARACTERSET'; shutdown immediate; startup; # exit 退出 sql 连接 docker restart 容器id # PL/SQL 需要在win10系统中添加环境变量: # NLS_LANG=SIMPLIFIED CHINESE_CHINA.ZHS16GBK # 需要在首选项,连接,配置oracle主目录及 oci.dll 的路径 # ------------------------ docker: oracle 12 c ------------------------------- docker pull absolutapps/oracle-12c-ee mkdir -p /data/oracle # 建立本地映射目录 # 创建容器。 privileged使容器内的root拥有真正的root权限 docker run -d -p 8080:8080 -p 1521:1521 -v /data/oracle:/u01/app/oracle --privileged --name oracle12c absolutapps/oracle-12c-ee # 检查是否创建成功 docker logs -f oracle12c # 查看一下日志,一定要等待100% complete # 进入容器内部 docker exec -it oracle12c /bin/bash su oracle sqlplus / as sysdba SQL> conn system/oracle as sysdba; alter user system identified by oracle; alter user sys identified by sys; ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED; create user test identified by test; grant connect,resource,dba to test; # 可以使用PL/SQL连接了 # http://ip:port/em 使用数据库的账密登录 # lsnrctl 控制台 (必须以oracle身份操作) help stop start reload # 查询 select * from rownum <= 100 # MATERIALIZED VIEW # 物化视图,以前叫快照 # --------------------------- EXP --------------------------- # 备份远程用户的全部东西到本地 exp ckmes/qt#it2012@10.170.1.57/QTSOFT buffer=64000 file=d:\ckmes.dmp owner=ckmes