一、安装docker
1.安装
(1)卸载之前的docker
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
(2)安装docker的依赖
yum install -y yum-utils \
device-mapper-persistent-data \
lvm2
(3)设置docker仓库
yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
(4)安装docker
yum install -y docker-ce docker-ce-cli containerd.io
(5)启动docker
systemctl start docker
(6)设置开机启动
systemctl enable docker
(7)测试是否安装成功,拉取一个hello-world镜像
docker pull hello-world
docker run hello-world
# 可以看到有以下输出
Hello from Docker!
2.配置加速器
(1)配置阿里云镜像加速器
阿里云控制台搜索 容器镜像服务
找到 镜像加速器
,根据右边的命令进行操作
在centos操作以下命令
# 1.创建文件夹
mkdir -p /etc/docker
# 2.写daemon.json文件
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://dokomztn.mirror.aliyuncs.com"]
}
EOF
# 3.重新加载上面的配置文件
systemctl daemon-reload
# 4.重启docker
systemctl restart docker
二、Docker基本操作
1.镜像操作
(1)拉取镜像
# 默认拉取dockerhub上面的最新版本
docker pull tomcat
# 拉取指定版本的镜像
docker pull tomcat:8
(2)查看所有镜像
docker images
(3)删除某一个镜像
# 根据镜像id删除,二选一即可
docker image rm imageid
docker rmi -f imageid
# 根据镜像名称删除,二选一即可
docker image rm 镜像名称
docker rmi -f 镜像名称
# 镜像后面可以通过 `:版本`,删除指定版本的,例如:
docker rmi -f hello-world:latest
(4)删除所有镜像
# 如果该镜像有运行中的容器,需要先停止基于该镜像创建的容器,否则删除会有问题
docker rmi -f $(docker image ls)
2.容器操作
(1)查看所有运行中的容器
docker ps
(2)查看所有的容器,包含非运行的
docker ps -a
(3)根据镜像创建容器
# 以tomcat为例,-d表示后台运行,--name为容器指定名称,-p表示将容器的端口映射到宿主主机的端口
docker run -d --name my-tomcat01 -p 9090:8080 tomcat
(4)进入到某一个容器
# my-tomcat01为容器名称,也可以是容器的id
docker exec -it my-tomcat01 /bin/bash
(5)查看容器使用情况
docker stats
(6)查看容器日志
docker logs 容器名称/容器id
(7)查看容器使用情况
docker inspect 容器名称/id
(8)停止/启动容器
docker start 容器名称/容器id
docker stop 容器名称/容器id
(9)删除某一个容器
# 删除之前需要先停止该容器
docker rm 容器名称/容器id
(10)删除所有容器
# 不需要停止即可删除
docker rm -f $(docker ps -aq)
3.安装tomcat
(1)指定拉取版本8的tomcat
docker pull tomcat:8
(2)启动tomcat容器
# 创建成功之后浏览器访问宿主主机ip加端口号9090即可
docker run -d --name my-tomcat-01 -p 9090:8080 tomcat
(3)tomcat启动完成之后访问404的问题
# 1.进入到tomcat的容器中
docker exec -it xxx /bin/bash
# 进入到webapps,查看是否有文件
cd webapps
# 如果没有的话就会出现404的问题,此时删除webapps文件夹,复制webapps.dist到webapps
rm -rf webapps
cp -r webapps.dist/. webapps
# 重新访问即可
docker network ls 查看网路类型,有bridge、host、none三种类型
docker inspect bridge查看网卡
找到tomcat容器所对应的ip地址,一般都是以172.17.0.x的,比如是172.17.0.3
在centos里面通过 curl http://172.17.0.3:9090
也可以访问到tomcat
4.安装mysql
(1)拉取mysql镜像
docker pull mysql
(2)创建mysql容器
# -e指定参数,docker中为mysql指定密码的参数为 `MYSQL_ROOT_PASSWORD`,
# --privileged使容器内的root用户拥有真正的root权限
docker run -d --name mysql01 -p 3301:3306 -e MYSQL_ROOT_PASSWORD=123456 --privileged mysql
(3)连接不上报 client does not support support authentication protocol requested by server…
# 重新修改root的密码和连接地址
alter user 'root'@'%' identified with mysql_native_password by '123456';
# 刷新
flush privileges;
三、Dockerfile
docker镜像库的github地址:https://github.com/docker-library
1.根据 Dockerfile生成image镜像
(1)这里以mysql为例,从docker-library找到mysql的Dockerfile文件,直接复制一份
(2)然后 linux创建一个文件夹 mysql-image
mkdir mysql-image
(3)进入到该文件夹里面,创建 Dockerfile
文件,
vi Dockerfile
(4)把上面的从docker-library复制的文件粘贴到这里的Dockerfile里面,然后保存退出
# NOTE: THIS DOCKERFILE IS GENERATED VIA "apply-templates.sh"
#
# PLEASE DO NOT EDIT IT DIRECTLY.
#
FROM debian:buster-slim
# add our user and group first to make sure their IDs get assigned consistently, regardless of whatever dependencies get added
RUN groupadd -r mysql && useradd -r -g mysql mysql
RUN apt-get update && apt-get install -y --no-install-recommends gnupg dirmngr && rm -rf /var/lib/apt/lists/*
# add gosu for easy step-down from root
# https://github.com/tianon/gosu/releases
ENV GOSU_VERSION 1.14
RUN set -eux; \
savedAptMark="$(apt-mark showmanual)"; \
apt-get update; \
apt-get install -y --no-install-recommends ca-certificates wget; \
rm -rf /var/lib/apt/lists/*; \
dpkgArch="$(dpkg --print-architecture | awk -F- '{ print $NF }')"; \
wget -O /usr/local/bin/gosu "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$dpkgArch"; \
wget -O /usr/local/bin/gosu.asc "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$dpkgArch.asc"; \
export GNUPGHOME="$(mktemp -d)"; \
gpg --batch --keyserver hkps://keys.openpgp.org --recv-keys B42F6819007F00F88E364FD4036A9C25BF357DD4; \
gpg --batch --verify /usr/local/bin/gosu.asc /usr/local/bin/gosu; \
gpgconf --kill all; \
rm -rf "$GNUPGHOME" /usr/local/bin/gosu.asc; \
apt-mark auto '.*' > /dev/null; \
[ -z "$savedAptMark" ] || apt-mark manual $savedAptMark > /dev/null; \
apt-get purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=false; \
chmod +x /usr/local/bin/gosu; \
gosu --version; \
gosu nobody true
RUN mkdir /docker-entrypoint-initdb.d
RUN set -eux; \
apt-get update; \
apt-get install -y --no-install-recommends \
openssl \
# FATAL ERROR: please install the following Perl modules before executing /usr/local/mysql/scripts/mysql_install_db:
# File::Basename
# File::Copy
# Sys::Hostname
# Data::Dumper
perl \
xz-utils \
zstd \
; \
rm -rf /var/lib/apt/lists/*
RUN set -eux; \
# gpg: key 3A79BD29: public key "MySQL Release Engineering <mysql-build@oss.oracle.com>" imported
key='859BE8D7C586F538430B19C2467B942D3A79BD29'; \
export GNUPGHOME="$(mktemp -d)"; \
gpg --batch --keyserver keyserver.ubuntu.com --recv-keys "$key"; \
mkdir -p /etc/apt/keyrings; \
gpg --batch --export "$key" > /etc/apt/keyrings/mysql.gpg; \
gpgconf --kill all; \
rm -rf "$GNUPGHOME"
ENV MYSQL_MAJOR 5.7
ENV MYSQL_VERSION 5.7.38-1debian10
RUN echo 'deb [ signed-by=/etc/apt/keyrings/mysql.gpg ] http://repo.mysql.com/apt/debian/ buster mysql-5.7' > /etc/apt/sources.list.d/mysql.list
# the "/var/lib/mysql" stuff here is because the mysql-server postinst doesn't have an explicit way to disable the mysql_install_db codepath besides having a database already "configured" (ie, stuff in /var/lib/mysql/mysql)
# also, we set debconf keys to make APT a little quieter
RUN { \
echo mysql-community-server mysql-community-server/data-dir select ''; \
echo mysql-community-server mysql-community-server/root-pass password ''; \
echo mysql-community-server mysql-community-server/re-root-pass password ''; \
echo mysql-community-server mysql-community-server/remove-test-db select false; \
} | debconf-set-selections \
&& apt-get update \
&& apt-get install -y \
mysql-server="${MYSQL_VERSION}" \
# comment out a few problematic configuration values
&& find /etc/mysql/ -name '*.cnf' -print0 \
| xargs -0 grep -lZE '^(bind-address|log)' \
| xargs -rt -0 sed -Ei 's/^(bind-address|log)/#&/' \
# don't reverse lookup hostnames, they are usually another container
&& echo '[mysqld]\nskip-host-cache\nskip-name-resolve' > /etc/mysql/conf.d/docker.cnf \
&& rm -rf /var/lib/apt/lists/* \
&& rm -rf /var/lib/mysql && mkdir -p /var/lib/mysql /var/run/mysqld \
&& chown -R mysql:mysql /var/lib/mysql /var/run/mysqld \
# ensure that /var/run/mysqld (used for socket and lock files) is writable regardless of the UID our mysqld instance ends up having at runtime
&& chmod 1777 /var/run/mysqld /var/lib/mysql
VOLUME /var/lib/mysql
COPY docker-entrypoint.sh /usr/local/bin/
RUN ln -s usr/local/bin/docker-entrypoint.sh /entrypoint.sh # backwards compat
ENTRYPOINT ["docker-entrypoint.sh"]
EXPOSE 3306 33060
CMD ["mysqld"]
(5)保存退出
:wq
(6)根据Dockerfile文件生成一个镜像
docker build -t mysql-image .
2.Dockerfile语法
# 指定基础镜像
FROM debian:buster-slim
# 运行
RUN groupadd -r mysql && useradd -r -g mysql mysql
# 设置变量的值,ENV MYSQL_MAJOR 5.7,可以通过docker run --e key=value修改,后面可以直接使用${MYSQL_MAJOR}
ENV MYSQL_MAJOR 5.7
# 设置镜像标签
LABEL
# 镜像的作者信息,即也就是Author
MAINTAINER tianqingzhao
# 数据存储在哪一个目录
VOLUME /var/lib/mysql
#将主机的文件复制到镜像内,如果目录不存在,会自动创建所需要的目录,注意只是复制,不会提取和解压
COPY docker-entrypoint.sh /usr/local/bin/
# 将主机的文件复制到镜像内,和COPY类似,只是ADD会对压缩文件提取和解压
ADD application.yml /etc/itcrazy2016/
# 指定镜像要暴露的端口,启动镜像时,可以使用-p将该端口映射给宿主机
EXPOSE 3306 33060
# 和CMD的使用类似
ENTRYPOINT ["docker-entrypoint.sh"]
3.Dockerfile入门
(1)编写springboot工程,添加maven依赖
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.0.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.gupao</groupId>
<artifactId>dockerfile-demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>dockerfile-demo</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
(2)提供一个接口
@SpringBootApplication
public class DockerfileDemoApplication {
public static void main(String[] args) {
SpringApplication.run(DockerfileDemoApplication.class, args);
}
@RestController
public class DockerController {
@GetMapping("/dockerfile")
@ResponseBody
String dockerfile(@RequestParam(defaultValue = "hello docker") String str) {
return str;
}
}
}
(3)自己编写一个Dockerfile文件
FROM openjdk:8
# 指定维护人
MAINTAINER tianqingzhao
# 指定镜像名称、版本、作者
LABEL name=“dockerfile-demo” version="1.0" author="tianqingzhao"
# 把centos的jar包拷贝到镜像里面
COPY dockerfile-demo-0.0.1-SNAPSHOT.jar springboot-dockerfile-demo.jar
# 执行该命令启动
CMD ["java", "-jar", "springboot-dockerfile-demo.jar"]
(4)构建镜像
docker build -t springboot-dockerfile-demo .
(5)创建容器
docker run -d --name springboot-dockerfile-demo springboot-dockerfile-demo
(6)查看日志
docker logs springboot-dockerfile-demo
(7)进入容器内访问
docker exec -it springboot-dockerfile-demo /bin/bash
(8)请求jar包的接口接口访问成功
curl http://localhost:8080/dockerfile
(9)将该容器的端口映射到centos上面,宿主主机的浏览器也可以访问
# 启动完成之后可以在我们的浏览器访问映射到centos的地址,centosip:8888/dockerfile
docker run -d --name springboot-dockerfile-demo02 -p 8888:8080 springboot-dockerfile-demo
四、Docker hub仓库
1.官方的Docker hub
dockerhub仓库地址:https://hub.docker.com
(1)首先注册账号和密码,注册完之后在centos登录
# centos通过 `docker login` 命令登录,账号和密码输入我们在 https://hub.docker.com 注册的
docker login --username=账号 https://hub.docker.com
# 给之前的sprinboot应用的镜像重新打一个标签(相当于拷贝一个副本)
docker tag springboot-dockerfile-demo:latest tianqingzhao/springboot-dockerfile-demo-hub:v1.0
# 推送到hub仓库
docker push tianqingzhao/springboot-dockerfile-demo-hub:v1.0
(2)等待推送完成,在dockerhub仓库就可以看到我们的镜像了
(3)推送完成之后,删除本地的镜像,从dockerhub里面拉取一下
# 先删除本地之前打好的标签
docker rmi -f tianqingzhao/springboot-dockerfile-demo:v1.0
# 拉取dockerhub仓库的
docker pull tianqingzhao/springboot-dockerfile-demo:v1.0
# 创建容器运行并访问
docker run -d --name springboot-dockerfile-demo-hub -p 8811:8080 tianqingzhao/springboot-dockerfile-demo:v1.0
# 外部浏览器访问也能成功
http://192.168.0.136:8811/dockerfile
2.阿里云Docker hub
(1)在 容器镜像服务
里面点击实例列表,然后创建个人版实例
(2)然后创建命名空间 qztian
,创建完成之后设置仓库类型为公有
(3)创建完成之后在centos登录阿里云进行推送
# 在centos登录阿里云,这里推送到哪个地区,推送成功之后就在阿里云控制台就选择哪一个地区查看,例如我这里推送到beijing,推送成功之后就选择北京
docker login --username=tianqingzhao registry.cn-beijing.aliyuncs.com
# 给springboot应用的image重新打一个标签(相当于拷贝一个副本)
docker tag 镜像名称 registry.cn-beijing.aliyuncs.com/阿里云命名空间名称/推送到阿里云镜像名称:版本号
# 比如我上面创建的命名空间名称为 qztian
docker tag springboot-dockerfile-demo registry.cn-beijing.aliyuncs.com/qztian/springboot-dockerfile-demo-aliyun:v1.0
# 推送到阿里云仓库
docker push registry.cn-beijing.aliyuncs.com/qztian/springboot-dockerfile-demo-aliyun:v1.0
(4)推送成功之后,选择我们推送的北京地区,就可以看到我们的镜像了
(5)从阿里云镜像仓库拉取我们推送的
# 同样先删除本地的
docker rmi -f registry.cn-beijing.aliyuncs.com/qztian/springboot-dockerfile-demo-aliyun:v1.0
# 拉取阿里云仓库
docker pull registry.cn-beijing.aliyuncs.com/qztian/springboot-dockerfile-demo-aliyun:v1.0
# 创建该镜像的容器,端口号映射到centos为8899,
docker run -d --name springboot-dockerfile-demo-aliyun -p 8899:8080 registry.cn-beijing.aliyuncs.com/qztian/springboot-dockerfile-demo-aliyun:v1.0
# 然后访问外部浏览器也能成功
http://192.168.0.136:8899/dockerfile
3.搭建自己的Docker harbor
(1)harbor基于docker-compose启动的,所以需要先安装docker-compose
# 下载 Docker-Compose版本,使用daocloud下载
curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
# 将可执行权限应用于二进制文件:
chmod +x /usr/local/bin/docker-compose
# 创建软链
ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
# 验证是否安装成功
docker-compose --version
(2)下载harbor压缩包
github仓库地址:https://github.com/goharbor/harbor
下载harbor安装包,地址:https://github.com/goharbor/harbor/releases?page=1
(3)下载完成之后解压,更改 harbor.yml
文件配置
# 连接地址
hostname: centos的ip
# 密码
harbor_admin_password: Harbor123456
(4)配置harbor的镜像地址
# 编辑/etc/docker/daemon.json文件
vi /etc/docker/daemon.json
# 加上该配置
"insecure-registries":["192.168.0.136:80"]
# 加完之后,配置harbor的ip以及端口,默认端口号80
{
"registry-mirrors": ["https://dokomztn.mirror.aliyuncs.com"],
"insecure-registries":["192.168.0.136:80"]
}
(5)启动harbor
./install.sh
(6)停止和启动
# 停止Harbor
docker-compose down -v
# 启动Harbor
docker-compose up -d
(7)推送一个镜像到Harbor,同阿里云镜像一样,这里先要新建一个项目
(8)新建好之后在centos登录harbor并复制镜像
# 登录harbor地址,然后输入密码显示登录成功即可
docker login -u admin 192.168.0.136:80
# 给springboot应用打一个标签。这里复制出来的镜像以ip:port/项目名称/镜像名称:版本号
docker tag springboot-dockerfile-demo:latest 192.168.0.136:80/qztian/springboot-dockerfile-demo-harbor:v1.0
# 推送
docker push 192.168.0.136:80/qztian/springboot-dockerfile-demo-harbor:v1.0
(9)推送完成之后进入到该项目即可看到
(10)推送完成之后同样拉取一把
# 拉取之前先删除本地之前打好的标签的镜像
docker rmi -f 192.168.0.136:80/qztian/springboot-dockerfile-demo-harbor:v1.0
# 从harbor上面拉取
docker pull 192.168.0.136:80/qztian/springboot-dockerfile-demo-harbor:v1.0
# 创建容器运行
docker run -d --name springboot-dockerfile-demo-harbor -p 8866:8080 192.168.0.136:80/qztian/springboot-dockerfile-demo-harbor:v1.0
# 外部浏览器访问该springboot应用的接口即可成功
http://192.168.0.136:8866/dockerfile
五、根据container创建出image
(1)拉取centos镜像
docker pull centos
(2)创建centos容器
# 加上-it是希望交互式启动,否则会停止
docker run -d -it --name my-centos centos:latest
(3)进入到该容器
docker exec -it my-centos /bin/bash
查看vim命令是否有,没有的话进行安装
yum install vim
安装 vim
命令的时候可能会如下错误:
Error: Failed to download metadata for repo 'appstream': Cannot prepare internal mirrorlist: No URLs
这是因为CentOS 官方在2020 年 12 月 8 号宣布了停止维护 CentOS Linux 的计划,并推出了 CentOS Stream 项目,CentOS Linux 8 作为 RHEL 8 的复刻版本,生命周期缩短,于 2021 年 12 月 31 日停止更新并停止维护(EOL),更多的信息可以查看 CentOS 官方公告。如果需要更新 CentOS,需要将镜像从 mirror.centos.org 更改为 vault.centos.org,参考文章:https://blog.csdn.net/weixin_43252521/article/details/124409151
# 分别执行以下命令解决上面报错问题
cd /etc/yum.repos.d/
sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-*
sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-*
yum makecache
yum update -y
yum -y install vim
(4)生成一个带 vim
命令的centos的image
docker commit my-centos vim-centos-image
创建容器
docker run -d -it --name my-vim-centos vim-centos-image
进入容器查看是否有vim命令
docker exec -it my-vim-centos /bin/bash
# 输入vim命令验证
使用commit生成的镜像不显示过程,使用Dockerfile生成的会显示每一步执行的过程,官网推荐的也是Dockerfile
六、container资源管理
1.启动一个tomcat,任何参数不配置分配默认的参数
docker run -d --name tomcat01 -p 8811:8080 tomcat:8
# 查看状态
docker stats tomcat01
# 会显示一下内容
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
258dd43c4d61 tomcat01 0.13% 60.45MiB / 2.709GiB 2.18% 656B / 0B 0B / 0B 25
2.使用命令监控
# 配置内容大小和cpu权重
docker run -d --name tomcat02 --memory 100M --cpu-shares 10 -p 8822:8080 tomcat:8
# 查看状态
docker stats tomcat02
# 回显示一下内容
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
ea61e5ea38e1 tomcat02 0.12% 45.02MiB / 100MiB 45.02% 656B / 0B 0B / 0B 18
3.可视化监控工具
github地址:https://github.com/weaveworks/scope
(1)快速开始
# 1.下载
curl -L git.io/scope -o /usr/local/bin/scope
# 上面如果报 Failed to connect to 2001::6817:7dbd: Network is unreachable 错误,就使用这条命令下载
curl -L https://github.com/weaveworks/scope/releases/download/latest_release/scope -o /usr/local/bin/scope
# 2.授权
chmod a+x /usr/local/bin/scope
# 3.启动
scope launch centos的ip
(2)启动成功之后就可以通过浏览器访问管理界面了,默认端口号4040
点击其中一个container可以查看使用情况
也可以点击image进行查看创建的container,感兴趣的自行研究