CentOS安装Docker 支持 64 位版本 CentOS 7/8,并且要求内核版本不低于 3.10。 CentOS 7 满足最低内核的要求,但由于内核版本比较低,部分功能(如 overlay2 存储层驱动)无法使用,并且部分功能可能不太稳定。
旧版本的 Docker称为 docker 或者 docker-engine,使用以下命令卸载旧版本:
$ sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-selinux \ docker-engine-selinux \ docker-engine
使用脚本安装时,在安装之前会自动进行检查,选择适合当前系统的包进行安装docker。如果发现有缺少的依赖,会自动进行安装。
curl https://get.docker.com > /tmp/install.sh
修改权限
chmod +x /tmp/install.sh
执行脚本
/tmp/install.sh
yum安装执行以下命令安装依赖包:
sudo yum install -y yum-utils
鉴于国内网络问题,强烈建议使用国内源,官方源请在注释中查看。
执行下面的命令添加 yum 软件源:
$ sudo yum-config-manager \ --add-repo \ https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo $ sudo sed -i 's/download.docker.com/mirrors.aliyun.com\/docker-ce/g' /etc/yum.repos.d/docker-ce.repo # 官方源 # $ sudo yum-config-manager \ # --add-repo \ # https://download.docker.com/linux/centos/docker-ce.repo
如果需要测试版本的 Docker 请执行以下命令:
$ sudo yum-config-manager --enable docker-ce-test
docker更新 yum 软件源缓存,并安装 docker-ce
$ sudo yum install docker-ce docker-ce-cli containerd.io
dockersystemctl enable docker systemctl restart docker
Unbuntu安装Docker Engine-Community 支持以下的 Ubuntu 版本:
Docker 的旧版本被称为 docker,docker.io 或 docker-engine 。如果已安装,请卸载它们:
sudo apt-get remove docker docker-engine docker.io containerd runc
当前称为 Docker Engine-Community 软件包 docker-ce 。
安装 Docker Engine-Community,以下介绍两种方式。
在新主机上首次安装 Docker Engine-Community 之前,需要设置 Docker 仓库。之后,您可以从仓库安装和更新 Docker 。
更新apt包索引
$ sudo apt-get update
安装 apt 依赖包,用于通过HTTPS来获取仓库:
$ sudo apt-get install \ apt-transport-https \ ca-certificates \ curl \ gnupg-agent \ software-properties-common
添加 Docker 的官方 GPG 密钥:
curl -fsSL https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
使用以下指令设置稳定版仓库
echo \ "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu/ \ $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \ sudo tee /etc/apt/sources.list.d/docker.list > /dev/null sudo apt-get update
更新apt包索引
$ sudo apt-get update
安装最新版本的 Docker Engine-Community 和 containerd ,或者转到下一步安装特定版本:
$ sudo apt-get install docker-ce docker-ce-cli containerd.io
要安装特定版本的 Docker Engine-Community,请在仓库中列出可用版本,然后选择一种安装。列出您的仓库中可用的版本:
$ apt-cache madison docker-ce docker-ce | 5:18.09.1~3-0~ubuntu-xenial | https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu xenial/stable amd64 Packages docker-ce | 5:18.09.0~3-0~ubuntu-xenial | https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu xenial/stable amd64 Packages docker-ce | 18.06.1~ce~3-0~ubuntu | https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu xenial/stable amd64 Packages docker-ce | 18.06.0~ce~3-0~ubuntu | https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu xenial/stable amd64 Packages ...
使用第二列中的版本字符串安装特定版本,例如 5:18.09.13-0ubuntu-xenial。
$ sudo apt-get install docker-ce=<VERSION_STRING> docker-ce-cli=<VERSION_STRING> containerd.io
Docker run docker run xxx echo "Hello World"
启动容器,输出信息
docker run -i -t xxx /bin/bash
启动容器,请求Docker提供一个容器中的Shell。这样就可以进入容器中的命令行了。其中的 -i 和 -t 参数表示我们想要一个交互会话,/bin/bash 参数表示你想获得一个 bash shell。当你推出 shell 时,容器就会停止
docker run -h CONTAINER -i -t xxx /bin/bash
启动容器,使用 -h 参数设置主机名(hostname)。移动 /bin目录的位置之后,现在这个容器已经没用了,至少暂时是这样的
docker psdocker ps
显示运行中容器的信息
docker ps -a
列出所有容器,包括已经停止的容器。
docker inspectdocker inspect xxx
显示容器的详细信息
容器信息太多。使用 grap 或者 --format 参数过滤感兴趣的信息。例如:
docker inspect xxx grep | IPAddress
docker inspect --format {{.NetworkSettings.IPAddress}} frosty_moore
docker diffdocker diff xxx
可以看到容器中文件改动状态。可以看到被删除的文件有 /bin,有新增的 /basket 以及它里面的文件
docker logsdocker logs xxx
显示容器的日志,能得知这个容器里曾经发生过的一切事情
docker rm docker rm xxx
删除容器
如果想删除所有已经停止的容器,可以利用 docker ps -aq -f status=exited 的结果,结果中包含所有已停止容器的 ID。例如:
docker rm -v $(docker ps -aq -f status=exited)
注意 -v 参数的作用,它意味着当所有有Dokcer管理的数据卷已经没有和任何容器关联时,都会一律删除。为了避免已停止的容器数据量不断增加,可以在执行docker run 的时候加上 --rm参数,它的作用是当容器退出时,容器和相关的文件系统会被一起删除。如下:
docker run -t -t --rm debain /bin/bash
可以看到在运行之前,存在一个已经停止的容器。在 运行并退出之后,没有新的已停止容器增加。
docker stopdocker stop xxx
停止容器
本案例采用
docker官方提供的pdf
创建一个镜像
docker run -it --name cowsay --hostname cowsay debian bash apt-get update apt-get install -y cowsay fortune
/usr/games/fortune | /usr/games/cowsay
docker commit cowsay xiayaling/widdo/cowsayimage
docker run test/cowsayimage /usr/games/cowsay "Moo"
Docker File
Dockerfile
FROM debian:wheezy #WORKDIR /usr/local/docker/image/cowsay LABEL author="widdo" email="only_xyl@163.com" #修改源 #备份系统默认源 RUN cp /etc/apt/sources.list /etc/apt/sources.list.bak #清空/etc/apt/sources.list RUN echo "deb http://mirrors.aliyun.com/debian/ jessie main contrib non-free" > /etc/apt/sources.list #RUN apt-get install -y cowsay RUN apt-get update && apt-get install -y cowsay fortune COPY entrypoint.sh / ENTRYPOINT ["/entrypoint.sh"]
entrypoint.sh
#!/bin/bash if [ $# -eq 0 ]; then /usr/games/fortune | /usr/games/cowsay else /usr/games/cowsay "$@" fi
注意:
创建docker工作目录,存放
Dockerfile文件
Dockerfile文件名,必须大写后续镜像中用到的文件,都要放到工作目录下
Dockerfile中需要修改 apt 的源,否则下载不下来参考下面我的路径
本文采用 Docker Hub 作为
docker的镜像仓库想要推送镜像到docker hub。需要满足如下条件:
Docker Hub上注册账号- 创建仓库。可以是
public,也可以是private(只能有一个private的)- 本地(
linux)上登录Docker Hub。使用docker login进行登录,输入用户名密码
参考 4
可选项。当镜像仓库不是自己
docker hub中的仓库时。可以通过添加标签的方式指定
docker tag xiayaling/widdo:cowsay-dockerfile-2.0
docker push xiayaling/widdo:cowsay-dockerfile-2.0
registry执行命令。
docker pull registry
创建目录,用来存放密码
mkdir -p /docker/registry/auth
htpasswd因为新版的
docker registry没有htpasswd命令(是指运行的registry容器中没有htpasswd命令),所以自己下载。注意:这个不是在容器里运行,实在
vm然后,用
htpasswd生成用户名和密码文件
yum install httpd-tools
命令格式:
htpasswd -Bbn 用户名 密码 > htpasswd。前一个htpasswd是命令,后一个是生成的用户名密码文件。需要在/docker/registry/auth目录下执行
htpasswd -Bbn widdo widdo_docker > htpasswd
注意:网上很多是这样的:
docker run --entrypoint htpasswd registry:latest -Bbn widdo widdo_docker >> /docker/registry/auth/htpasswd
这个命令是指运行
docker registry容器里的htpasswd命令。但是报错exec: "htpasswd": executable file not found in $PATH: unknown.。就是原先的registry版本里有htpasswd命令,现在的没有了。
docker registry运行如下命令
docker run -d -p 5000:5000 --name registry --restart=always \ -v /docker/registry/auth:/auth/ \ -e "REGISTRY_AUTH=htpasswd" \ -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \ -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \ -e REGISTRY_STORAGE_DELETE_ENABLED=true \ registry:latest
docker-compose方式进入
docker/registry/auth目录下。实际使用的目录:
- /opt/software/docker/registry
- /auth
- /data
- docker-compose.yml
version: '3.8' services: registry: image: registry container_name: docker-registry ports: - "5000:5000" environment: REGISTRY_AUTH: htpasswd REGISTRY_AUTH_HTPASSWD_REALM: Registry Realm REGISTRY_AUTH_HTPASSWD_PATH: ./auth/htpasswd REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY: /data volumes: - ./data:/data - ./auth:/auth
登录搭建的私有
docker仓库
docker login xxx:5000
输入用户名密码之后,这个地方会报错
解决方案
修改
/etc/docker/daemon.json,添加配置vim /etc/docker/daemon.json #添加如下内容 {"insecure-registries":["xxxx:5005","xxxx"]}加载配置,重启
docker服务systemctl daemon-reload systemctl restart docker
重新登录
docker registry
dcoker tag 镜像:[tag] 服务端IP:端口/镜像名:tag
docker tag nginx:stable-alpine 101.42.10.77:5000/nginx:local
执行命令
docker push
docker push 101.42.10.77:5000/nginx:local
执行命令
curl -u "用户名:密码" -X GET http://101.42.10.77:5000/v2/_catalog
Dokcer远程服务idea 打包生成docker镜像时,用到的插件里面需要配置docker的远程服务
进入目录
/usr/lib/systemd/system/docker.service下,添加-H tcp://0.0.0.0:2375。相当于开放2375端口
ExecStart=usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock 改为: ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock -H tcp://0.0.0.0:2375
systemctl daemon-reload systemctl restart docker
执行一下命令
curl https://127.0.0.1:2375/version
maven插件,用来生成docker镜像。常用的有三个:
com.spotify/docker-maven-plugin,支持镜像的创建和提交com.spotify/dockerfile-maven-plugin,支持镜像的创建和提交io.fabric8/docker-maven-plugin,支持镜像的创建和提交,容器的启动和停止
com.spotify/docker-maven-plugin配置如下:
<plugin> <groupId>com.spotify</groupId> <artifactId>docker-maven-plugin</artifactId> <version>1.2.2</version> <configuration> <serverId>docker-hub</serverId> <registryUrl>https://hub.docker.com/</registryUrl> <imageName>widdo-image</imageName> <!-- 指定 Dockerfile 路径 ${project.basedir}:项目根路径下--> <dockerDirectory>${project.basedir}</dockerDirectory> <!--指定远程 docker api地址--> <dockerHost>${docker.host}</dockerHost> <!-- 这里是复制 jar 包到 docker 容器指定目录配置 --> <resources> <resource> <targetPath>/</targetPath> <!--jar 包所在的路径 此处配置的 即对应 target 目录--> <directory>${project.build.directory}</directory> <!-- 需要包含的 jar包 ,这里对应的是 Dockerfile中添加的文件名 --> <include>${project.build.finalName}.jar</include> </resource> </resources> </configuration> <!--将插件绑定到maven的生命周期中--> <executions> <execution> <id>build-image</id> <phase>package</phase> <goals> <goal>build</goal> </goals> </execution> <execution> <id>tag-image</id> <phase>package</phase> <goals> <goal>tag</goal> </goals> <configuration> <image>widdo-image</image> <newName>https://hub.docker.com/widdo-image</newName> </configuration> </execution> <execution> <id>push-image</id> <phase>deploy</phase> <goals> <goal>push</goal> </goals> <configuration> <imageName>widdo-image</imageName> </configuration> </execution> </executions> </plugin>
使用
可以和maven的生命周期进行绑定。执行mvn 命令的时候,自动执行绑定的 docker 命令
mvn package 绑定 docker build mvn deploy 绑定 docker push
存在问题:
复制很多文件。
目录嵌套。
target/目录下嵌套很多层dcoker信息 。也可能是没用对,不过目前还没找到原因
问题一:复制很多文件
问题二:目录嵌套
优点
github文档比较清晰dockerfilemaven的生命周期绑定缺点
github不活跃,最近一次提交是3年前com.spotify/dockerfile-maven-plugin配置如下:
<plugin> <groupId>com.spotify</groupId> <artifactId>dockerfile-maven-plugin</artifactId> <version>1.4.13</version> <executions> <execution> <id>default</id> <goals> <goal>build</goal> <goal>push</goal> </goals> </execution> </executions> <configuration> <contextDirectory>${project.basedir}</contextDirectory> <!--注意:官方github的readme提供的配置中,没有配置dockerfile,导致镜像构建的的时候找不到 dockerfile 而报错,出现dockerfile:null--> <dockerfile>${project.basedir}</dockerfile> <repository>${docker.registry}/${project.artifactId}</repository> <tag>${project.version}</tag> <buildArgs> <JAR_FILE>${project.basedir}/${project.build.finalName}.${project.packaging}</JAR_FILE> </buildArgs> </configuration> </plugin>
使用
可以和maven的生命周期进行绑定。执行mvn 命令的时候,自动执行绑定的 docker 命令
mvn package 绑定 docker build mvn deploy 绑定 docker push
结果如下:
存在问题:
- 官方github的readme提供的配置中,没有添加
dockerfile,会导致build的时候,找不到dockerfile.从而docker build报错- 镜像创建的时候需要
docker环境,而插件com.spotify/dockerfile-maven-plugin默认找本地的docker环境,如果本地是windows的话,不装docker环境会报错,出现上图找不到docker_engine的情况
优点:
配置更加简单,只需要关心:仓库,标签,dockerfile。纯粹的面向 dockerfile
不存在复制过多文件和目录嵌套问题
镜像的生命周期可以和maven的生命周期绑定
缺点
github文档存在问题docker环境github 不活跃,最近一次提交是3年前io.fabric8/docker-maven-plugin配置如下:
<plugin> <groupId>io.fabric8</groupId> <artifactId>docker-maven-plugin</artifactId> <version>0.39.0</version> <!--全局配置--> <configuration> <!--配置远程docker守护进程url--> <dockerHost>${docker.host}</dockerHost> <!--认证配置,用于私有registry认证--> <authConfig> <username>${docker.username}</username> <password>${docker.password}</password> </authConfig> <!--用于在标准输出中打开详细输出的字符串属性,默认是false--> <verbose>true</verbose> <!--镜像相关配置,支持多镜像--> <images> <!-- 单个镜像配置 --> <image> <!--镜像名(含版本号)--> <name>${docker.registry}/${project.name}:${project.version}</name> <!--registry地址,用于推送,拉取镜像--> <registry>${docker.registry}</registry> <!--镜像build相关配置--> <build> <!--docker-assembly.xml 定义镜像中的文件--> <!-- <assembly> </assembly>--> <!--使用dockerFile文件,定义构建镜像的流程--> <dockerFile>${project.basedir}/Dockerfile</dockerFile> </build> </image> </images> </configuration> </plugin>
使用
不可以和maven的生命周期进行绑定。只能单独执行 docker命令
docker build docker push
结果如下:
优点
build,push,又支持container的启动和停止缺点
整体来说,推荐使用
io.fabric8/docker-maven-plugin
docker失败原因
Docker有两个服务进程 分别是/usr/lib/systemd/system/docker.service 和 /usr/lib/systemd/system/docker.socket 上面的警告意味着如果试图停止docker服务,但是docker.socket还处于激活状态
解决
docker socketsystemctl stop docker.socket
根据提示可知:在停止
docker.socket之后,docker服务停止了
docker.socket文件cd /lib/systemd/system/ && rm -rf docker.socket
查看
docker状态
systemctl status docker.service
重新创建
docker.socket
cd /lib/systemd/system vim docker.socket #添加以下内容 [Unit] Description=Docker Socket for the API PartOf=docker.service [Socket] ListenStream=/var/run/docker.sock SocketMode=0660 SocketUser=root SocketGroup=docker [Install] WantedBy=sockets.target
重启
docker
systemctl daemon-reload systemctl restart docker.service
Docker 启动时报错:iptables:No chain/target/match by the namedocker服务启动的时候,docker服务会向iptables注册一个链,以便让docker服务管理的containner所暴露的端口之间进行通信
通过命令iptables -L可以查看iptables 链
在开发环境中,如果你删除了iptables中的docker链,或者iptables的规则被丢失了(例如重启firewalld),docker就会报iptables error例如:failed programming external connectivity … iptables: No chain/target/match by that name
要解决这个问题,只要重启docker服务,之后,正确的iptables规则就会被创建出来
查询文件及子目录大小
du -h --max-depth=1
查看磁盘空间
df -h
分析哪个文件夹占用内存比较高
du -h -d 1 /
分析容器日志文件
du -hl -d 1 /var/lib/docker/containers/
全局配置。修改docker配置文件。
- 通过
vim /etc/docker/dameon.json,添加以下配置。
{ "log-driver":"json-file", "log-opts": {"max-size":"500m", "max-file":"5"} }
max-size表示一个容器日志文件大小上限是500Mmax-file表示容器最多有5个日志。id.json、id+1.json 等。以上配置 500M*5 = 2.5G
- 重启
docker服务
systemctl daemon-reload systemctl restart docker
**注意:**已经存在的容器不会生效,需要重新创建。
docker-compose容器限制
version: '3' services: service-name: image: image-xxx restart: always logging: # driver: "none" # 关闭日志 driver: "json-file" options: max-size: "100m" max-file: "3"
docker配置jvm参数
dockerfile中添加环境参数
### 基础镜像,使用alpine操作系统,openjkd使用 FROM 101.43.194.240:5000/jdk:openjdk14 # 作者 LABEL authro="widdo" email="only_xyl@163.com" ARG VERSION ARG SERVICE_NAME ARG SERVICE_PORT ARG JAVA_OPTS ENV VERSION ${VERSION} ENV SERVICE_NAME ${SERVICE_NAME} ENV SERVICE_PORT ${SERVICE_PORT} # 系统编码 ENV LANG=C.UTF-8 LC_ALL=en_US.UTF-8 # 运行参数 ENV JAVA_OPTS ${JAVA_OPTS} RUN echo "JAVA_OPTS=${JAVA_OPTS}" # 声明一个挂载点,容器内此路径会对应宿主机的某个文件夹 VOLUME /tmp #RUN echo "JAR Path: $(pwd)/target/${SERVICE_NAME}-${VERSION}.jar" # 检查JAR文件是否存在 # 应用构建成功后的jar文件被复制到镜像内,名字也改成了app.jar ADD ./target/${SERVICE_NAME}-${VERSION}.jar /app.jar # 声明运行时端口 EXPOSE ${SERVICE_PORT} # 启动容器时的进程 ENTRYPOINT java ${JAVA_OPTS} -Djava.security.egd=file:/dev/./urandom -jar /app.jar
docker-compose中配置
#gateway服务 gateway: image: ${REGISTRY_URI}/${GATEWAY_SERVICE_NAME}:${VERSION} container_name: ${GATEWAY_SERVICE_NAME} build: context: ../context dockerfile: develop/Dockerfile args: - VERSION=${VERSION} - SERVICE_NAME=${GATEWAY_SERVICE_NAME} - SERVICE_PORT=${GATEWAY_SERVICE_PORT} - JAVA_OPTS=-Xmx256m -Xms256m ports: - ${GATEWAY_SERVICE_PORT}:${GATEWAY_SERVICE_PORT} #指定网络,所有服务处于同一网络 #networks: # - my_network command: - --spring.profiles.active=env - --spring.config.location=../../nacos/gateway.yaml
**注意:**参数JAVA_OPTS
验证
容器中验证jvm配置是否生效
- 进入容器
docker exec -it xxx bash
- 执行命令
jcmd 1 VM.flags
-XX:InitialHeapSize:初始堆大小。同-Xms -XX:MaxHeapSize: 最大堆大小。 同-Xmx -XX:MinHeapDeltaBytes: 表示当JVM决定是否要做或者尝试扩容的时候最小扩/缩多少,JDK1.8以下默认为192K,JDK1.8默认512K -XX:newSize:表示新生代初始内存的大小 -XX:MaxNewSize:JVM堆区域新生代内存的最大可分配大小 -XX:OldSize:老生代的大小 -XX:+UseParallelGC:指 定在New Generation 使用 parallel collector垃圾收集器 -XX:CICompilerCount:最大并行编译数 -XX:+UseCompressedClassPointers:开启类指针压缩 -XX:+UseCompressedOops:开启普通对象指针压缩
Docker-compose下载docker-compose的可执行文件
sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
赋予可执行权限给下载的二进制文件
sudo chmod +x /usr/local/bin/docker-compose
创建一个符号链接,将docker-compose命令链接到/usr/bin目录,以便可以全局访问
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
运行命令docker-compose vsersion查看信息
docker-compose version
本文作者:widdo
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!