Docker是一种新的技术,尽管它的发行日期已是好几年前。概括来说,Docker是一个开源的应用容器引擎,常被用来和虚拟机做对比,它让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的Linux或Windows机器上,也可以实现虚拟化。对的,虚拟机也可以实现这种需求,但装系统,装配置环境,占用内存大等缺点让Dockers大放光彩。当然,也有人对这种技术呈批判态度,详见一场令人追悔莫及的豪赌。技术无对错,并且它带来的便捷性已经在很多公司体现,我们还是需要空杯学习一下这种技术。
以下为常见操作实践:
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
## 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
# 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镜像私服:
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
// -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 用户的密码。
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/
sudo docker pull mobz/elasticsearch-head:5
docker run -d --name elasticsearch-head -p 9100:9100 mobz/elasticsearch-head:5
访问:
http://localhost:9100/
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/
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
注意: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 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解释器交互
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”]