Docker之入门

一、安装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,感兴趣的自行研究
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值