Docker 修改容器时间和宿主机时间一致
ENV TZ 'Asia/Shanghai'
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone && apt-get update && apt-get install -y tzdata
ENV TZ 'Asia/Shanghai'
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone && apt-get update && apt-get install -y tzdata
lsb_release -a
uname
rpm -q redhat-release
cat /proc/version
vi /etc/sysconfig/network-scripts/ifcfg-eth0 配制DNS
yum update nss
rpm –import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org 导入KEY
rpm -Uvh http://www.elrepo.org/elrepo-release-6-8.el6.elrepo.noarch.rpm 安装ELRepo
yum –enablerepo=elrepo-kernel install kernel-lt –y 安装内核
vi /etc/grub.conf # 改为default=0 修改引导文件,将默认引导改为0
reboot 启完成后查看内核版本
yum install docker-io
提示错误:No package docker-io available,则运行
yum -y install http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
yum install epel-release
yum -y install https://get.docker.com/rpm/1.7.1/centos-6/RPMS/x86_64/docker-engine-1.7.1-1.el6.x86_64.rpm
service docker start
查看已安装的包:
yum list installed | grep docker
删除软件包:
yum -y remove docker-io.x86_64
删除镜像/容器:
rm -rf /var/lib/docker
docker 安装之后,通过命令查看docker相关信息时,可能会出现错误:Get http:///var/run/docker.sock/v1.19/version: dial unix /var/run/docker.sock: no such file or directory. Are you trying to connect to a TLS-enabled daemon without TLS?
服务无法正常停止或重启,可能就是系统环境出现了问题,
You may have to enable the public_ol6_latest repo in order to get this package.
sudo yum-config-manager –enable public_ol6_latest
And then install the package:
sudo yum install device-mapper-event-libs
#配置访问的地址
hostname = 198.168.88.88
#使用http方式访问管理界面
ui_url_protocol = http
#配置admin的密码,默认是Harbor12345
harbor_admin_password = 12345
#更改harbor存储路径,默认是/data
secretkey_path = /data/harbor
certificate: /data/harbor/cert/harbor.xxx.com.crt
private_key: /data/harbor/cert/harbor.xxx.com.key
/compose_location/docker-compose.yml
安装Harbor
./install.sh
保存数据重新安装 (先进入harbor目录)
docker-compose up -d
docker-compose down -v
./install.sh可以重新安装
ocker-compose ps 查看
开始、停止、重启
您可以使用docker-compose来管理Harbor的生命周期。一些有用的命令列出如下(必须与docker-compose.yml在同一目录中运行)。
sudo docker-compose start/stop/restart
更新配置
要更改Harbour的配置,请先停止现有的Harbor实例并进行更新harbor.cfg。然后运行prepare脚本以填充配置。最后重新创建并启动Harbor的实例:
sudo docker-compose down -v
sudo vim harbor.cfg
sudo prepare
sudo docker-compose up -d
删除Harbor的容器,同时将镜像数据和Harbor的数据库文件保存在文件系统上
sudo docker-compose down -v
删除Harbor的数据库和镜像数据(用于干净的重新安装)
rm -r /data/database
rm -r /data/registry
错误
vi /etc/docker/daemon.json
{
"insecure-registries":["192.168.88.98:5000"],
"registry-mirrors":["https://cuzn52f3.mirror.aliyuncs.com","https://registry.docker-cn.com","https://reg-mirror.qiniu.com"],
"exec-opts": ["native.cgroupdriver=systemd"]
}
vi /etc/default/docker
DOCKER_OPTS="--insecure-registry 192.168.88.98"
vi /etc/systemd/system/multi-user.target.wants/docker.service
可以在systemctl status docker 中查看具体配制文件路径
ExecStart=/usr/bin/dockerd -H fd:// $DOCKER_OPTS
Docker Compose 可以轻松、高效的管理容器,它是一个用于定义和运行多容器 Docker 的应用程序工具
官网
1. 安装 Docker Compose 可以通过下面命令自动下载适应版本的 Compose,并为安装脚本添加执行权限
sudo curl -L "https://github.com/docker/compose/releases/download/1.25.3/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.4/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
使用工具安装 pip install docker-compose
version: '2' # 表示该 Docker-Compose 文件使用的是 Version 2 file
services:
docker-demo: # 指定服务名称
build: . # 指定 Dockerfile 所在路径
ports: # 指定端口映射
- "9000:8761"
在 docker-compose.yml 所在路径下执行该命令 Compose 就会自动构建镜像并使用镜像启动容器
docker-compose up
docker-compose up -d // 后台启动并运行容器
访问 http://localhost:9000/hello 即可访问微服务接口
Docker Compose 将所管理的容器分为三层,分别是工程(project)、服务(service)、容器(container)
Docker Compose 运行目录下的所有文件(docker-compose.yml)组成一个工程,一个工程包含多个服务,每个服务中定义了容器运行的镜像、参数、依赖,一个服务可包括多个容器实例
Docker Compose 常用命令与配置
ps:列出所有运行容器
docker-compose ps
logs:查看服务日志输出
docker-compose logs
port:打印绑定的公共端口,下面命令可以输出 eureka 服务 8761 端口所绑定的公共端口
docker-compose port eureka 8761
build:构建或者重新构建服务
docker-compose build
start:启动指定服务已存在的容器
docker-compose start eureka
stop:停止已运行的服务的容器
docker-compose stop eureka
rm:删除指定服务的容器
docker-compose rm eureka
up:构建、启动容器
docker-compose up
kill:通过发送 SIGKILL 信号来停止指定服务的容器
docker-compose kill eureka
pull:下载服务镜像
scale:设置指定服务运气容器的个数,以 service=num 形式指定
docker-compose scale user=3 movie=3
run:在一个服务上执行一个命令
docker-compose run web bash
docker-compose.yml 属性
version:指定 docker-compose.yml 文件的写法格式
services:多个容器集合
build:配置构建时,Compose 会利用它自动构建镜像,该值可以是一个路径,也可以是一个对象,用于指定 Dockerfile 参数
““
build:
context: ./dir
dockerfile: Dockerfile
args:
buildno: 1
command:覆盖容器启动后默认执行的命令
command: [bundle,exec,thin,-p,3000]
dns:配置 dns 服务器,可以是一个值或列表
dns:
– 8.8.8.8
– 9.9.9.9
dns_search:配置 DNS 搜索域,可以是一个值或列表
dns_search:
– dc1.example.com
– dc2.example.com
environment:环境变量配置,可以用数组或字典两种方式
environment:
RACK_ENV: development
environment:
– RACK_ENV=development
– SHOW=ture
env_file:从文件中获取环境变量,可以指定一个文件路径或路径列表,其优先级低于 environment 指定的环境变量
env_file:
– ./common.env
expose:暴露端口,只将端口暴露给连接的服务,而不暴露给主机
expose:
– “3000”
– “8000”
image:指定服务所使用的镜像
image: java
network_mode:设置网络模式
network_mode: “bridge”
network_mode: “host”
network_mode: “none”
network_mode: “service:[service name]”
network_mode: “container:[container name/id]”
ports:对外暴露的端口定义,和 expose 对应
ports: # 暴露端口信息 – “宿主机端口:容器暴露端口”
– “8763:8763”
– “8763:8763”
links:将指定容器连接到当前连接,可以设置别名,避免ip方式导致的容器重启动态改变的无法连接情况
links: # 指定服务名称:别名
– docker-compose-eureka-server:compose-eureka
volumes:卷挂载路径
volumes:
– /lib
– /var
logs:日志输出信息
–no-color 单色输出,不显示其他颜.
-f, –follow 跟踪日志输出,就是可以实时查看日志
-t, –timestamps 显示时间戳
–tail 从日志的结尾显示,–tail=200
Docker Compose 其它
更新容器
当服务的配置发生更改时,可使用 docker-compose up 命令更新配置
此时,Compose 会删除旧容器并创建新容器,新容器会以不同的 IP 地址加入网络,名称保持不变,任何指向旧容起的连接都会被关闭,重新找到新容器并连接上去
links
服务之间可以使用服务名称相互访问,links 允许定义一个别名,从而使用该别名访问其它服务
version: ‘2’
services:
web:
build: .
links:
– “db:database”
db:
image: postgres
这样 Web 服务就可以使用 db 或 database 作为 hostname 访问 db 服务了
.编写超级简单版本的 dockerfile 文件:
# jdk 是一个已有的包含 jdk 的镜像 mcr.microsoft.com/java/jdk:8u232-zulu-ubuntu
FROM jdk
# 作者签名
MAINTAINER JY
# 简化 jar 的名字路径 (#:表示注释掉)
COPY jar/eurekaserver-0.0.1-SNAPSHOT.jar /app.jar
# 执行 java -jar 命令 (CMD:在启动容器时才执行此行。RUN:构建镜像时就执行此行)
CMD java -jar /app.jar
#CMD [“bash”,“-c”,“java -jar app.jar”]
# 设置对外端口
EXPOSE 8761
通过 dockerfile 文件生成本工程的镜像:
docker build -t gentle .
======================================
参考自动脚本构建
cd gentle_code
# 备份原代码
tar -zcvf gentle.tar ./gentle
# 删除原代码文件夹
rm -rf gentle
# 拉取代码
echo -e “\033[32m\n从git拉取代码\n\033[0m”
git clone https://gitee.com/FJ_WoMenDeShiJie/gentle.git
echo -e “\033[32m\n代码拉取完成\n\033[0m”
# 工程打包
cd gentle
rm -rf ./target/gentle-1.0-SNAPSHOT.jar
echo -e “\033[32m\n开始打jar包\n\033[0m”
mvn install -Dmaven.test.skip=true
rm -rf ../../jar/gentle-1.0-SNAPSHOT.jar
cp ./target/gentle-1.0-SNAPSHOT.jar ../../jar
echo -e “\033[32m\njar包完成\n\033[0m”
# 删除原镜像
docker rmi gentle &> /dev/null
echo -e “\033[32m\n删除原镜像\n\033[0m”
echo -e “\033[32m\n构建新镜像\n\033[0m”
cd ../../
docker build -t gentle .
echo -e “\033[32m\n新镜像构建成功\n\033[0m”
# 删除原容器
docker rm -f gentle
# 启动容器
docker run -d -p 8089:8089 –name gentle gentle
echo -e “\033[32m\n后端工程部署完成\n\033[0m”
======================================
或者使用手动更新jar包时,需要在把xxx.jar包复制进容器时,统一重命名为app.jar
docker cp 宿主机jar包 容器名(或容器ID):/app.jar
说明:此方式的优势在于:每次如果要更新jar包,只需要先将容器stop,然后直接替换容器里面的jar包,最后再将该容
器start即可。无需每次都创建新的镜像,创建新的容器。
指令:FROM
功能描述:设置基础镜像
语法:FROM < image>[:< tag> | @< digest>]
提示:镜像都是从一个基础镜像(操作系统或其他镜像)生成,可以在一个Dockerfile中添加多条FROM指令,一次生成多个镜像
注意:如果忽略tag选项,会使用latest镜像
指令:MAINTAINER
功能描述:设置镜像作者
语法:MAINTAINER < name>
指令:RUN
功能描述:
语法:RUN < command>
RUN [“executable”,”param1”,”param2”]
提示:RUN指令会生成容器,在容器中执行脚本,容器使用当前镜像,脚本指令完成后,Docker Daemon会将该容器提交为一个中间镜像,供后面的指令使用
补充:RUN指令第一种方式为shell方式,使用/bin/sh -c < command>运行脚本,可以在其中使用\将脚本分为多行
RUN指令第二种方式为exec方式,镜像中没有/bin/sh或者要使用其他shell时使用该方式,其不会调用shell命令
例子:RUN source $HOME/.bashrc;\
echo $HOME
RUN [“/bin/bash”,”-c”,”echo hello”]
RUN [“sh”,”-c”,”echo”,”$HOME”] 使用第二种方式调用shell读取环境变量
指令:CMD
功能描述:设置容器的启动命令
语法:CMD [“executable”,”param1”,”param2”]
CMD [“param1”,”param2”]
CMD < command>
提示:CMD第一种、第三种方式和RUN类似,第二种方式为ENTRYPOINT参数方式,为entrypoint提供参数列表
注意:Dockerfile中只能有一条CMD命令,如果写了多条则最后一条生效
指令:LABEL
功能描述:设置镜像的标签
延伸:镜像标签可以通过docker inspect查看
格式:LABEL < key>=< value> < key>=< value> …
提示:不同标签之间通过空格隔开
注意:每条指令都会生成一个镜像层,Docker中镜像最多只能有127层,如果超出Docker Daemon就会报错,如LABEL ..=.. <假装这里有个换行> LABEL ..=..合在一起用空格分隔就可以减少镜像层数量,同样,可以使用连接符\将脚本分为多行
镜像会继承基础镜像中的标签,如果存在同名标签则会覆盖
指令:EXPOSE
功能描述:设置镜像暴露端口,记录容器启动时监听哪些端口
语法:EXPOSE < port> < port> …
延伸:镜像暴露端口可以通过docker inspect查看
提示:容器启动时,Docker Daemon会扫描镜像中暴露的端口,如果加入-P参数,Docker Daemon会把镜像中所有暴露端口导出,并为每个暴露端口分配一个随机的主机端口(暴露端口是容器监听端口,主机端口为外部访问容器的端口)
注意:EXPOSE只设置暴露端口并不导出端口,只有启动容器时使用-P/-p才导出端口,这个时候才能通过外部访问容器提供的服务
指令:ENV
功能描述:设置镜像中的环境变量
语法:ENV < key>=< value>…|< key> < value>
注意:环境变量在整个编译周期都有效,第一种方式可设置多个环境变量,第二种方式只设置一个环境变量
提示:通过${变量名}或者 $变量名使用变量,使用方式${变量名}时可以用${变量名:-default} ${变量名:+cover}设定默认值或者覆盖值
ENV设置的变量值在整个编译过程中总是保持不变的
指令:ADD
功能描述:复制文件到镜像中,不能用在 multistage 的场景下,ADD 命令可以完成 COPY 命令的所有功能,并且还可以完成两类超酷的功能:
语法:ADD < src>… < dest>|[“< src>”,… “< dest>”]
注意:当路径中有空格时,需要使用第二种方式
当src为文件或目录时,Docker Daemon会从编译目录寻找这些文件或目录,而dest为镜像中的绝对路径或者相对于WORKDIR的路径
提示:src为目录时,复制目录中所有内容,包括文件系统的元数据,但不包括目录本身
src为压缩文件,并且压缩方式为gzip,bzip2或xz时,指令会将其解压为目录
如果src为文件,则复制文件和元数据
如果dest不存在,指令会自动创建dest和缺失的上级目录
***对于目录而言,COPY 和 ADD 命令具有相同的特点:只复制目录中的内容而不包含目录自身,如果要包含目录本身需要在目标路径中指定这个目录的名称
在使用 COPY 和 ADD 命令时,我们可以通过一些技巧来加速镜像的 build 过程。比如把那些最不容易发生变化的文件的拷贝操作放在较低的镜像层中,这样在重新 build 镜像时就会使用前面 build 产生的缓存。
指令:COPY
功能描述:复制文件到镜像中 仅仅是把本地的文件拷贝到容器镜像中,COPY 命令是最合适不过的,在 multistage 的用法中,可以使用 COPY 命令把前一阶段构建的产物拷贝到另一个镜像中
语法:COPY < src>… < dest>|[“< src>”,… “< dest>”]
提示:指令逻辑和ADD十分相似,同样Docker Daemon会从编译目录寻找文件或目录,dest为镜像中的绝对路径或者相对于WORKDIR的路径
指令:ENTRYPOINT
功能描述:设置容器的入口程序
语法:ENTRYPOINT [“executable”,”param1”,”param2”]
ENTRYPOINT command param1 param2(shell方式)
提示:入口程序是容器启动时执行的程序,docker run中最后的命令将作为参数传递给入口程序
入口程序有两种格式:exec、shell,其中shell使用/bin/sh -c运行入口程序,此时入口程序不能接收信号量
当Dockerfile有多条ENTRYPOINT时只有最后的ENTRYPOINT指令生效
如果使用脚本作为入口程序,需要保证脚本的最后一个程序能够接收信号量,可以在脚本最后使用exec或gosu启动传入脚本的命令
注意:通过shell方式启动入口程序时,会忽略CMD指令和docker run中的参数
为了保证容器能够接受docker stop发送的信号量,需要通过exec启动程序;如果没有加入exec命令,则在启动容器时容器会出现两个进程,并且使用docker stop命令容器无法正常退出(无法接受SIGTERM信号),超时后docker stop发送SIGKILL,强制停止容器
例子:FROM ubuntu <换行> ENTRYPOINT exec top -b
指令:VOLUME
功能描述:设置容器的挂载点
语法:VOLUME [“/data”]
VOLUME /data1 /data2
提示:启动容器时,Docker Daemon会新建挂载点,并用镜像中的数据初始化挂载点,可以将主机目录或数据卷容器挂载到这些挂载点
指令:USER
功能描述:设置RUN CMD ENTRYPOINT的用户名或UID
语法:USER < name>
指令:WORKDIR
功能描述:设置RUN CMD ENTRYPOINT ADD COPY指令的工作目录
语法:WORKDIR < Path>
提示:如果工作目录不存在,则Docker Daemon会自动创建
Dockerfile中多个地方都可以调用WORKDIR,如果后面跟的是相对位置,则会跟在上条WORKDIR指定路径后(如WORKDIR /A WORKDIR B WORKDIR C,最终路径为/A/B/C)
指令:ARG
功能描述:设置编译变量
语法:ARG < name>[=< defaultValue>]
注意:ARG从定义它的地方开始生效而不是调用的地方,在ARG之前调用编译变量总为空,在编译镜像时,可以通过docker build –build-arg < var>=< value>设置变量,如果var没有通过ARG定义则Daemon会报错
可以使用ENV或ARG设置RUN使用的变量,如果同名则ENV定义的值会覆盖ARG定义的值,与ENV不同,ARG的变量值在编译过程中是可变的,会对比使用编译缓存造成影响(ARG值不同则编译过程也不同)
例子:ARG CONT_IMAG_VER <换行> RUN echo $CONT_IMG_VER
ARG CONT_IMAG_VER <换行> RUN echo hello
当编译时给ARG变量赋值hello,则两个Dockerfile可以使用相同的中间镜像,如果不为hello,则不能使用同一个中间镜像
指令:ONBUILD
功能描述:设置自径想的编译钩子指令
语法:ONBUILD [INSTRUCTION]
提示:从该镜像生成子镜像,在子镜像的编译过程中,首先会执行父镜像中的ONBUILD指令,所有编译指令都可以成为钩子指令
指令:STOPSIGNAL
功能描述:设置容器退出时,Docker Daemon向容器发送的信号量
语法:STOPSIGNAL signal
提示:信号量可以是数字或者信号量的名字,如9或者SIGKILL,信号量的数字说明在Linux系统管理中有简单介绍
官网 https://www.docker.com/
安装 https://docs.docker.com/v17.09/engine/installation/linux/docker-ce/ubuntu/#docker-ee-customers
镜像市场 http://hub.docker.com
教程 https://www.runoob.com/docker/docker-tutorial.html
国内高速下载Docker 以及 docker-compose 地址
http://get.daocloud.io
https://blog.csdn.net/nklinsirui/article/details/80610058
# step 1: 安装必要的一些系统工具
sudo apt-get update
sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-common
# step 2: 安装GPG证书
curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
# Step 3: 写入软件源信息
sudo add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
# Step 4: 更新并安装Docker-CE
sudo apt-get -y update
sudo apt-get -y install docker-ce
# 安装指定版本的Docker-CE:
# Step 1: 查找Docker-CE的版本:
# apt-cache madison docker-ce
# docker-ce | 17.03.1ce-0ubuntu-xenial | http://mirrors.aliyun.com/docker-ce/linux/ubuntu xenial/stable amd64 Packages# docker-ce | 17.03.0ce-0ubuntu-xenial | http://mirrors.aliyun.com/docker-ce/linux/ubuntu xenial/stable amd64 Packages
# Step 2: 安装指定版本的Docker-CE: (VERSION例如上面的17.03.1ce-0ubuntu-xenial)
# sudo apt-get -y install docker-ce=[VERSION]
Created symlink /etc/systemd/system/multi-user.target.wants/docker.service → /lib/systemd/system/docker.service.
Created symlink /etc/systemd/system/sockets.target.wants/docker.socket → /lib/systemd/system/docker.socket.
#使用快速安装ubuntu 18
sudo apt install docker.io
增加配制:自己的仓库地址,镜像仓库地址X需更改,使用systemd与K8s同样配制
增加配制:3自己的仓库地址,镜像仓库地址X需更改,使用systemd与K8s同样配制 /etc/docker/daemon.json
{
"insecure-registries":["harbor.com","192.168.88.128:5000"],
"registry-mirrors":["https://cuzn52fX.mirror.aliyuncs.com","https://reg-mirror.qiniu.com","https://registry.docker-cn.com"],
"exec-opts": ["native.cgroupdriver=systemd"],
"storage-driver": "overlay2",
"storage-opts": ["overlay2.override_kernel_check=true"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m",
"max-file": "3"
},
"max-concurrent-downloads": 5,
"max-concurrent-uploads": 5
}
# 将Docker加入开启启动
$ sudo systemctl enable docker
# 启动Docker
$ sudo systemctl start docker
systemctl daemon-reload 重新加载
systemctl restart docker 重启docker
建立Docker用户组
默认情况下,docker命令会使用Unix Socket与Docker引擎通信,只有root用户和docker组的用户才可以访问Docker引擎的Unix Socket。出于安全考虑,一般不会直接使用root用户,所以需要先建立docker组,并将当前用户添加到docker组中。
$ sudo groupadd docker
$ sudo usermod -aG docker $USER
docker info
docker version
docker ps -a
docker images
docker exec -it container-id /bin/bash exit
docker logs -f container-id
docker stop -f container-id
docker rmi Image-file
docker rm container-id
docker login
bocker build -t coustName:tag .
bocker build -t coustName:tag -f path
docker tag mysql:5.6 myreg/mysql:1.0
docker push myreg/mysql:1.0
Dockerfile
七牛 quay-mirror.qiniu.com
sudo systemctl stop docker
sudo apt-get purge docker-ce
或
sudo apt-get remove docker docker-ce docker-io