Docker实践总结

Docker是一种新的技术,尽管它的发行日期已是好几年前。概括来说,Docker是一个开源的应用容器引擎,常被用来和虚拟机做对比,它让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的Linux或Windows机器上,也可以实现虚拟化。对的,虚拟机也可以实现这种需求,但装系统,装配置环境,占用内存大等缺点让Dockers大放光彩。当然,也有人对这种技术呈批判态度,详见一场令人追悔莫及的豪赌。技术无对错,并且它带来的便捷性已经在很多公司体现,我们还是需要空杯学习一下这种技术。

以下为常见操作实践:

Centos7安装操作:
1 卸载老版本的 docker 及其相关依赖
sudo yum remove docker docker-common container-selinux docker-selinux docker-engine
2 安装 yum-utils
sudo yum install -y yum-utils
3添加阿里云docker的yum源
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
4更新yum索引
sudo yum makecache fast
5安装 docker-ce
sudo yum install docker-ce
6启动 docker
sudo systemctl start docker
~可以查看所有仓库中所有docker版本,并自己选择版本安装
yum list docker-ce --showduplicates | sort -r
Ubuntu安装操作:
## 1. 查看docker安装情况
sudo apt-cache search all | grep docker
## 2. 卸载docker
sudo apt-get remove docker docker-engine docker-ce docker.io
## 3. 查看信息
sudo docker info
## 4. 查看镜像
sudo docker image ls
Docker镜像源修改:

# vi /etc/docker/daemon.json  ---修改或新增 /etc/docker/daemon.json
{
"registry-mirrors": ["http://hub-mirror.c.163.com"]
}
systemctl restart docker.service
进程启动/停止:
sudo systemctl start docker
sudo systemctl stop docker
拉取镜像:
sudo systemctl pull zookeeper
启动镜像:
sudo docker run --privileged=true -d --name zookeeper --publish 2181:2181  -d zookeeper:latest
查看启动镜像:
sudo docker ps 
sudo docker ps -a :查看所有容器,包括停止的
停止镜像:
sudo docker stop 0e2511b527f2
删除镜像:
sudo docker rmi kibana:6.6.1    或者 sudo docker rmi IMAGEID
查看容器日志:
docker logs 3d58e0b1d4b8
进入容器:
sudo docker exec -it elasticsearch:6.6.1 /bin/bash
删除容器:
sudo docker rm [NAME]/[CONTAINER ID]:不能够删除一个正在运行的容器,会报错。需要先停止容器。
构建Registry镜像私服:
构建Registry镜像私服:
构建Harbor镜像私服(大部分企业使用):
1 root安装docker-compose
curl -L https://github.com/docker/compose/releases/download/1.24.1/docker-compose-`uname -s `-`uname -m` > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
安装命令补全插件 
yum install bash-completion
添加到补全命令
curl -L https://raw.githubusercontent.com/docker/compose/$(docker-compose version --short)/contrib/completion/bash/docker-compose > /etc/bash_completion.d/docker-compose
docker-compose -v

2 下载harbor
wget https://github.com/goharbor/harbor/releases/download/v1.9.2/harbor-online-installer-v1.9.2.tgz
3 解压缩并修改配置文件
vim harbor.yml
4 安装
./install.sh
5 登录 默认root/配置的harbor_admin_password

6 推镜像到私服
    docker login 192.168.70.31
    在项目中标记镜像: docker tag SOURCE_IMAGE[:TAG]  192.168.70.31/library/IMAGE[:TAG]
    推送镜像到当前项目: docker push 192.168.70.31/library/IMAGE[:TAG]
7 下载镜像
    docker pull 192.168.70.31/library/hello:latest

8 停止harbor
    docker-compose stop
MySQL镜像:
// -v是数据卷挂载
docker run -p 3306:3306 --name mysql -v $PWD/conf:/etc/mysql/conf.d -v $PWD/logs:/logs -v $PWD/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.6
命令说明:
  -p 3306:3306:将容器的 3306 端口映射到主机的 3306 端口。
  --name : 镜像的名称
  -v $PWD/conf:/etc/mysql/conf.d:将主机当前目录下的 conf/my.cnf 挂载到容器的 /etc/mysql/my.cnf。
  -v $PWD/logs:/logs:将主机当前目录下的 logs 目录挂载到容器的 /logs。
  -v $PWD/data:/var/lib/mysql :将主机当前目录下的data目录挂载到容器的 /var/lib/mysql 。
  -e MYSQL_ROOT_PASSWORD=123456:初始化 root 用户的密码。
安装ElasticSearch:
sudo docker pull elasticsearch:6.6.1
sudo docker run -d -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:6.6.1
#配置外部文件启动
sudo docker run --rm -it -p 9200:9200 -p 9300:9300 -v "$PWD"/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml elasticsearch:6.6.1

#进入容器,可修改/config下的elasticsearch.yml配置或者指定外部配置文件
sudo docker exex -it elasticsearch:6.6.1 /bin/bash

访问:
curl 127.0.0.1:9200            http://192.168.70.31:9200/
安装ElasticSearch-Head:
sudo docker pull mobz/elasticsearch-head:5
docker run -d --name elasticsearch-head -p 9100:9100 mobz/elasticsearch-head:5
访问:
http://localhost:9100/
安装Kibana:
sudo docker pull kibana:6.6.1
可以使用--link连接到elasticsearch容器
sudo docker run -it -d --name kibana -p 5601:5601 kibana:7.3.0
修改kibana.yml中的es地址
重启:sudo docker restart kibana
访问:
http://192.168.70.31:5601/
安装logstash:
sudo docker pull logstash:7.3.1
sudo docker run --name logstash logstash:7.3.0
sudo docker exec -it logstash /bin/bash
修改config配置文件 vi logstash.yml
修改pipeline配置文件 vi logstash.conf
上传Jar包到Docker Registry私库:
注意:Registry私库不需要登录即可上传,二harbor需要登录,无法使用jib上传
在pom文中添加如下配置并修改,开启私库http支持,然后使用package打包即可推送至私库

    
        
        
            org.springframework.boot
            spring-boot-maven-plugin
        
        
        
            com.google.cloud.tools
            jib-maven-plugin
            0.9.8
            
            
                
                    package
                    
                        build
                    
                
            
            
            
                
                
                    openjdk:8-jre-alpine
                
                
                
                    192.168.70.31:5000/${project.artifactId}:${project.version}
                
                true
            
        
    

Docker操作查询:

docker search  hello-docker  # 搜索hello-docker的镜像
docker search centos # 搜索centos镜像
docker pull hello-docker # 获取centos镜像
docker run  hello-world   #运行一个docker镜像,产生一个容器实例(也可以通过镜像id前三位运行)
docker image ls  # 查看本地所有镜像
docker images  # 查看docker镜像
docker image rmi hello-docker # 删除centos镜像
docker ps  #列出正在运行的容器(如果创建容器中没有进程正在运行,容器就会立即停止)
docker ps -a  # 列出所有运行过的容器记录
docker save centos > /opt/centos.tar.gz  # 导出docker镜像至本地
docker load < /opt/centos.tar.gz   #导入本地镜像到docker镜像库
docker stop  `docker ps -aq`  # 停止所有正在运行的容器
docker  rm `docker ps -aq`    # 一次性删除所有容器记录
docker rmi  `docker images -aq`   # 一次性删除所有本地的镜像记录

# 1. 后台运行一个docker
docker run -d centos /bin/sh -c "while true;do echo 正在运行; sleep 1;done"
    # -d  后台运行容器
    # /bin/sh  指定使用centos的bash解释器
    # -c 运行一段shell命令
    # "while true;do echo 正在运行; sleep 1;done"  在linux后台,每秒中打印一次正在运行
docker ps  # 检查容器进程
docker  logs  -f  容器id/名称  # 不间断打印容器的日志信息
docker stop centos  # 停止容器

# 2. 启动一个bash终端,允许用户进行交互
docker run --name mydocker -it centos /bin/bash
    # --name  给容器定义一个名称
    # -i  让容器的标准输入保持打开
    # -t 让Docker分配一个伪终端,并绑定到容器的标准输入上
    # /bin/bash 指定docker容器,用shell解释器交互

DockerFile 详解:

FROM scratch #制作base image 基础镜像,尽量使用官方的image作为base image
FROM centos #使用base image
FROM ubuntu:14.04 #带有tag的base image

LABEL version=“1.0” #容器元信息,帮助信息,Metadata,类似于代码注释
LABEL maintainer=“[email protected]"

#对于复杂的RUN命令,避免无用的分层,多条命令用反斜线换行,合成一条命令!
RUN yum update && yum install -y vim
    Python-dev #反斜线换行
RUN /bin/bash -c "source $HOME/.bashrc;echo $HOME”

WORKDIR /root #相当于linux的cd命令,改变目录,尽量使用绝对路径!!!不要用RUN cd
WORKDIR /test # 如果没有就自动创建
WORKDIR demo # 再进入demo文件夹
RUN pwd     # 打印结果应该是/test/demo

ADD and COPY
ADD hello /  # 把本地文件添加到镜像中,吧本地的hello可执行文件拷贝到镜像的/目录
ADD test.tar.gz /  # 添加到根目录并解压

WORKDIR /root
ADD hello test/  # 进入/root/ 添加hello可执行命令到test目录下,也就是/root/test/hello 一个绝对路径
COPY hello test/  # 等同于上述ADD效果

ADD与COPY
   - 优先使用COPY命令
    -ADD除了COPY功能还有解压功能
添加远程文件/目录使用curl或wget

ENV # 环境变量,尽可能使用ENV增加可维护性
ENV MYSQL_VERSION 5.6 # 设置一个mysql常量
RUN yum install -y mysql-server=“${MYSQL_VERSION}”
进阶知识(了解)
VOLUME and EXPOSE
存储和网络

RUN and CMD and ENTRYPOINT
RUN:执行命令并创建新的Image Layer
CMD:设置容器启动后默认执行的命令和参数
ENTRYPOINT:设置容器启动时运行的命令

Shell格式和Exec格式
RUN yum install -y vim
CMD echo ”hello docker”
ENTRYPOINT echo “hello docker”

Exec格式
RUN [“apt-get”,”install”,”-y”,”vim”]
CMD [“/bin/echo”,”hello docker”]
ENTRYPOINT [“/bin/echo”,”hello docker”]


通过shell格式去运行命令,会读取$name指令,而exec格式是仅仅的执行一个命令,而不是shell指令
cat Dockerfile
    FROM centos
    ENV name Docker
    ENTRYPOINT [“/bin/echo”,”hello $name”]#这个仅仅是执行echo命令,读取不了shell变量
    ENTRYPOINT  [“/bin/bash”,”-c”,”echo hello $name"]

CMD
容器启动时默认执行的命令
如果docker run指定了其他命令(docker run -it [image] /bin/bash ),CMD命令被忽略
如果定义多个CMD,只有最后一个执行

ENTRYPOINT
让容器以应用程序或服务形式运行
不会被忽略,一定会执行
最佳实践:写一个shell脚本作为entrypoint
COPY docker-entrypoint.sh /usr/local/bin
ENTRYPOINT [“docker-entrypoint.sh]
EXPOSE 27017
CMD [“mongod”]

[root@master home]# more Dockerfile
FROm centos
ENV name Docker
#CMD ["/bin/bash","-c","echo hello $name"]
ENTRYPOINT ["/bin/bash","-c","echo hello $name”]

你可能感兴趣的:(Docker)