Docker学习笔记

Dokcer组成

Docker Client和Docker server

Docker组件

镜像(Image)

容器(Container)

仓库(Repoistory)

Docker与虚拟机区别

容器是进程间做隔离

虚拟机是操作系统间做隔离的

Docker镜像管理

搜索镜像

docker search XX

获取镜像

docker pull

查看镜像

docker images

删除镜像

docker rmi 

导入镜像

docker load --input <镜像文件名>

导出镜像

docker save -o centos.tar centos

Dokcer容器管理

运行容器

docker run [option] centos 

查看容器状态

docker ps -a

运行一个容器

docker run --name mydocker -t -i centos /bin/bash
    # -t 分配一个终端
    # -i 打开标准输入
    # centos 镜像名

启动与停止容器

docker start|stop 

不进入容器执行命令

docker exec  

删除容器

docker rm 

查看容器的端口映射

docker port 

进入容器

方法1:

docker attach 
    # 输入exit会退出容器,并且关闭容器

方法2:

安装相关工具

yum install -y util-linux

获取容器ID

docker inspect -f "{{.State.Pid}}" 

进入容器

nsent -t  -m -u -i -n -p

当然作为手艺人的我们怎么能忍受每次进入容器都要进行这么繁琐的操作呢?说好的脚本呢

#!/bin/env bash
#
##############################################################
# Author sam                        #
# Use nsenter  - Access Docker Container                     #
#                                                            #
# Date: 2018/9/19                                            #
#                                                            #
# System: CentOS 7                                           #
#                                                            #
##############################################################
# Development environment CentOS 7                           #
Docker_Login (){
    Name_ID=$1
    Pid=$(docker inspect -f "{{.State.Pid}}" $Name_ID)
    nsenter -t $Pid -m -u -i -n -p
}

if [ ! "$1" ];then
    echo "Use (CONTAINER ID|NAMES)"
else
    Docker_Login $1
fi

方法3:

docker exec -it  /bin/bash

Docker的端口映射

四种:

-p hostport:ContainerPort
-p ip:hostport:ContainerPort
-P ip::ContainerPort
-p hostport:ContainerPort:udp

例如:

docker run -d -p 192.168.100.1:81:80 --name test mycentos

Docker数据管理

随机挂载物理某目录到容器的/data目录

docker run --name volume -d -v /data centos
    # -v 后面是挂载到容器的位置

查看物理的哪个目录挂载到了容器的/data目录

docker inspect -f {{.Mounts}} volume

指定挂载/porject/volume目录到容器的/data目录

mkdir -p /project/volume
docker run -d --name volume2 -v /project/volume:/data centos

挂载的过程中也可以指定权限

docker run -d --name volume2 -v /project/volume:/data:ro centos

多容器间数据共享

docker run -d --name volume2 -v /project/volume:/data:ro centos
docker run -d --name volume3 --volumes-from volume2 centos
docker run -d --name volume4 --volumes-from volume2 centos

Docker的镜像构建

手动

(1)创建并进入一个容器

docker run --name mynginx -i -t centos

(2)安装相关软件

yum install -y nginx
yum clean all

(3)编辑nginx.conf,添加daemon off

daemon off;                     # 不以守护进程方式启动

(4)退出容器

 (5)用该容器生成镜像

docker commit -m "mynginx"  nginx-image

(6)查看镜像

docker images

(7)启动容器

docker run --name mynginx-v1 -d -p 81:80 nginx-image nginx

Dockerfile生成镜像

(1)编写Dockerfile文件

# 注释
# This Dockerfile
FROM centos
# Maintainer
MAINTAINER    sam.wen          [email protected]
# Commands
RUN rpm -ivh http://mirros.aliyun.com/........
RUN yum install -y nginx && yum clean all
RUN echo "daemo off;" >>/etc/nginx/nginx.conf
ADD index.html /usr/share/nginx/html/index.html
EXPOSE 80
CMD ["nginx"]

(2)构建镜像

docker build -t mynginx:v3

(3)查看镜像

docker images

(4)启动容器

docker run --name mynginx001 -d -p  82:80 mynginx:v3

总结:

FROM                    # 指定基础镜像
MAINTAINER              # 维护者信息
RUN                     # 在命令前面加上RUN
ADD                     # copy文件(会自动解压)
WORKDIR                 # 设置当前工作目录
VOLUME                  # 设置卷挂载主机目录
ENV                     # 设置环境变量
EXPOSE                  # 指定对外的端口
CMD                     # 指定容器启动后要干的事情

应用场景实例

(1)创建镜像结构目录

mkdir -pv system/{centos,ubuntu,centos-ssh} runtime/{python,node-v8.9.1,mysql-v5.7.19,redis-server} app/{rdc-manager,push-server,gateway}

(2)查看目录结构

[root@Operation Docker]# tree
.
├── app
│   ├── push-server
│   ├── rdc-gateway
│   │   ├── app-supervisor.ini
│   │   ├── connector.tar.gz
│   │   ├── Dockerfile
│   │   ├── nginx.conf
│   │   ├── RedcoreSPA_SAAS.tgz
│   │   ├── test.sh
│   │   └── YSPREAD.lua.backup
│   └── rdc-manager
├── docker_login.sh
├── runtime
│   ├── mysql-v5.7.19
│   ├── node-v8.9.1
│   ├── python
│   ├── rdc-gateway-clean
│   │   ├── Dockerfile
│   │   └── gateway_runtime.tar.gz
│   └── redis-server
└── system
    ├── centos
    ├── centos-ssh
    │   ├── app-supervisor.ini
    │   ├── Dockerfile
    │   ├── Dockerfile.old
    │   ├── sshd_config
    │   └── supervisord.conf
    └── ubuntu

(2)创建生产环境需求的系统基础镜像(安装SSH、supervisor)

cd system/centos-ssh/

编辑系统Dockerfile文件

# RedCore base OS
#
# Includ SSH Supervisor GCC 
#
FROM centos
#
# Maintainer
#
MAINTAINER Changwei [email protected]
#
# Commands
#
RUN rm -rf /etc/yum.repos.d/*
RUN curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
RUN yum install -y openssh-server python-setuptools.noarch gcc && yum clean all
#
# Configuring supervisor
#
RUN easy_install supervisor
RUN mkdir -p /etc/supervisor/conf.d && chmod 755 /etc/supervisor/conf.d
#
# Configuring sshd
#
RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key
RUN ssh-keygen -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key
RUN echo "root:redcore.cn" | chpasswd
#
# Add file 
#
ADD sshd_config /etc/ssh/sshd_config
ADD supervisord.conf /etc/supervisor/
ADD app-supervisor.ini /etc/supervisor/conf.d/app-supervisor.ini
#
# External port 
#
EXPOSE 22
#
# Command 
#
CMD ["/usr/bin/supervisord","-c","/etc/supervisor/supervisord.conf"]

本示例中给镜像自定义了三个配置文件,分别为sshd_config、supervisor.conf、supervisor.ini

在该示例中sshd_config文件的修改内容基本是一些简单加固参数,所以不特殊说明,主要说明下另外两个配置文件关于docker容器相关的设置。

编辑supervisor.conf,修改include的files位置为如下内容

[include]
files = /etc/supervisor/conf.d/*.ini

修改nodaemon为true

nodaemon=true

编辑app-supervisor.ini

[program:sshd]
command=/usr/sbin/sshd -D
process_name=%(program_name)s
autostart=true

(3)构建镜像

docker build -t redcore-centos .

(4)构建运行环境镜像

cd /project/Docker/runtime/rdc-gateway-clean

编译Dockerfile

# RedCore gateway clean  Java Openresty ENV
#
# Includ SSH Supervisor GCC 
#
FROM redcore-centos
#
# Maintainer
#
MAINTAINER Changwei [email protected]
#
# Add file 
#
ADD gateway_runtime.tar.gz /project
#
# Configuring gateway 
#
RUN ln -s /project/gmssl/lib/libssl.so.1.1 /usr/lib64/libssl.so.1.1
RUN ln -s /project/gmssl/lib/libcrypto.so.1.1 /usr/lib64/libcrypto.so.1.1
RUN ln -s /project/jdk1.8.0_131/ /usr/jdk
RUN rm -rf gateway_runtime.tar.gz
#
# Set ENV
#
ENV GMSSL /project/gmssl/bin
ENV JAVA_HOME /usr/jdk
ENV CLASSPATH $JAVA_HOME/lib/
ENV GATEWAY_CONFIG_DIR /project/openresty/nginx/conf/
ENV GATEWAY_CONNECTOR_LOG_PATH /project/connector/
ENV GATEWAY_CONNECTOR_LOG_LEVEL INFO
ENV NGINX_PATH /project/openresty/nginx/sbin/
ENV PATH $PATH:$GMSSL:$JAVA_HOME/bin
#
# Command 
#
CMD ["/usr/bin/supervisord","-c","/etc/supervisor/supervisord.conf"]

准备好gateway_runtime.tar.gz文件并构建镜像

docker build -t rdc-gateway-clean .

(5)构建生产环境镜像

cd /project/Docker/app/rdc-gateway

编辑Dockerfile文件

# RedCore gateway SPA  Java Openresty
#
# Includ SPA
#
FROM rdc-gateway-clean
#
# Maintainer
#
MAINTAINER Changwei [email protected]
#
# Add file 
#
ADD nginx.conf /project/openresty/nginx/conf/nginx.conf
ADD app-supervisor.ini /etc/supervisor/conf.d/app-supervisor.ini
ADD YSPREAD.lua.backup /project/openresty/site/YSPREAD.lua
ADD connector.tar.gz /project
ADD RedcoreSPA_SAAS.tgz /project
#
# Configuring SPA
#
RUN yum install -y iptables && yum clean all
RUN mkdir /etc/fwknop
ENV CONNECTOR_SERVER 192.168.99.100
ENV SERVER_PORT 8080
#
# External port 
#
EXPOSE 8080 62201
#
# Command 
#
CMD ["/usr/bin/supervisord","-c","/etc/supervisor/supervisord.conf"]

准备好相关文件并配置app-supervisor.ini文件

[program:sshd]
command=/usr/sbin/sshd -D
process_name=%(program_name)s
autostart=true

[program:nginx]
command=/project/openresty/nginx/sbin/nginx
process_name=%(program_name)s
autostart=true

[program:connector]
directory = /project/connector
command= java -Xms1024m -Xmx1024m -jar Redcore_GatewayConnector-1.0.0-boot.jar
process_name=%(program_name)s
autostart=true

[program:spa]
directory = /project/RedcoreSPA
command= bash run_redcoreSDP.sh
process_name=%(program_name)s
autostart=true   

构建镜像

docker build -t rdc-gateway .

Docker创建网络

(1)创建网络

docker network create --subnet=192.168.99.0/24 docker-br0

(2)启动容器并使用指定IP地址

docker run --name gateway-test1 --privileged --env MANAGER_ADDRESS="192.168.1.6" --net docker-br0 --ip 192.168.99.100 -d -p 5123:22 -p 80:80 -p 62201:62201/udp -p 8080:8080 rdc-gateway

(3)查看现有网络连接

docker network ls

那些天踩过的坑

(1)构建镜像时仓库名和镜像名及tag不能有大写字母

(2)为保证docker网络的畅通,宿主机防火墙必须开启

(3)构建失败时会有容器卡在哪里

(4)ENV设置的环境变量不能通过SSH进入引用

那些天总结出的技巧

容器运行停止后自动删除容器

dokcer run --name changwei  --rm -d centos 

不进入容器执行命令

docker exec mydocker ps -aux

关闭当前宿主机的所有容器

docker kill $(docker ps -a q)

删除所有容器

docker rm $(docker ps -a -q)

 

你可能感兴趣的:(Linux运维)