当前位置: 首页 > 工具软件 > docker-gen > 使用案例 >

【docker】- docker 入门

阎成天
2023-12-01

安装

Centos

  1. 清除旧版本
sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine
  1. 安装
sudo yum install -y yum-utils

sudo yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo
    
sudo yum install docker-ce docker-ce-cli containerd.io   
  1. 启动docker
sudo systemctl start docker
  1. 测试docker
sudo docker run hello-world

ubuntu

  1. 清除旧版本
sudo apt-get remove docker docker-engine docker.io containerd runc
  1. 安装
sudo apt-get update
sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg-agent \
    software-properties-common
sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"
sudo apt-get install docker-ce docker-ce-cli containerd.io

3.测试docker

sudo docker run hello-world

阿里云镜像加速

换源后加速明显:
【参照博主的另一篇博客】

docker 命令

版本信息&帮助

docker version	#docker 版本信息
docker info		#docker 详细信息
docker --help	#docker

镜像命令

查看本机镜像

docker images [option]	#列出本机上的所有镜像
#显示结果的表头含义如下
#RESPITORY 镜像的仓库源
#TAG 镜像的标签【统一仓库源可以有多个TAG,用于规定不同版本】
#IMAGE ID 镜像
#CREARED 镜像的创建时间
#SIZE 镜像大小
# option:
# -a 列出本地所有的镜像(包含中间映像层)
# -q 只显示镜像ID
# --digests 显示镜像的摘要信息
# --no-trunc 显示完整的镜像信息

仓库中搜索镜像

docker search [options] <imageName>	#在远程库搜索镜像
#option
# --no-trunc 显示完整的镜像描述
# -s<number> 列出收藏不小于number的镜像
# --automated 只列出 automated build类型的镜像

获取镜像

docker pull <imageName>[:TAG] #从远程库获取指定镜像,添加版本则获取指定版本,不添加则获取最新版

删除镜像

docker rmi -f <Image> #删除指定镜像ID的镜像
docker rmi -f <Image1:TAG> <Image2:TAG> #删除多个

commit镜像

docker commit -m="commitInfo" -a="author" <containerID> <要创建的目标镜像名>:[标签名]

容器指令

新建容器并运行

docker run [options] <image> [command] [arg...] #新建并启动容器
# options 说明
# --name=名字 :为容器指定一个名称
# -d 后台运行,并返回容器ID,也即启动守护式容器
# -i 以交互模式运行容器
# -t 为容器重新分配一个伪输入终端,通常与 -i 一起使用
# -P 随机端口映射
# -p 指定端口映射
# 演示:
docker run -it -p 80:8080 tomcat # 创建Tomcat容器并启动,同时将宿主机的80端口映射给容器8080端口

查看容器

docker ps [options]
# options
# -a 列出当前所有正在运行的+历史上运行过的容器
# -l 列出最近所创建的容器
# -n<number> 显示最近number个创建的容器
# -q 只显示容器编号

退出容器

exit #容器停止并退出
ctrl+P+Q #容器不停止退出

重启&启动&停止容器

docker start <containerID_OR_containerName>		#启动容器
docker restart <containerID_OR_containerName>	#重启容器
docker stop <containerID_OR_containerName>		#停止容器
docker kill <containerID_OR_containerName>		#强制关闭容器

查看容器日志

docker logs [options] <containerId>
# options
# -t 加入时间戳
# -f 跟随最新的日志打印
# --tail <number> 显示

查看容器内进程

docker top <container>	#显示当前容器内部进程

进入【正在运行】的容器并以命令行交互

docker exec -it <containerID> <COMMAND>
docker attach <containerID>

从容器内拷贝文件到主机上

docker cp <containerID>:<containerLoacation> <hostLocation>

容器数据卷

卷就是目录或文件,存在于一个或多个容器中,由docker挂载到容器。卷的设计目的就是数据的持久化,完全独立于容器的生命周期,因此docker不会再容器删除时删除其挂载的数据卷。

特点:

  1. 数据卷可在容器主键共享或重用数据
  2. 卷中的更改可以直接生效
  3. 数据中的更改不会包含在镜像的更新中
  4. 数据卷的生命周期一直持续到没有容器使用它为止

添加容器和宿主机间的目录映射

docker run -it -v <hostLocation>:<containerLocation> <imagesName>	#可读写
docker run -it -v <hostLocation>:<containerLocation>:ro <imageName> #只读

dockerFile

类比一下

JavaEE Hello.java ----> Hello.class
Docker images ----> DockerFile

Docker File 就是对docker镜像的描述文件。

  • DockerFile内容基础知识

1.每条保留字指令都必须为大写字母后面且后面要跟随至少一个参数

2.指令按照从上到下,顺序执行

3.#标识注释

4.每条指令都会创建一个新的镜像层,并对镜像进行提交

  • Docker执行dockerFile的大致流程

1.docker从基础镜像运行一个容器

2.执行一条指令并对容器做出修改

3.执行类似docker commit 的操作提交一个新的镜像层

4.docker再基于刚提交的镜像运行一个新容器

5.执行dockerfile中的下一条指令直到所有指令都执行完成

  • 关键字

FROM 基础镜像,当前新镜像是基于哪个镜像的

MAINTAINER 镜像维护者的姓名和邮箱地址

RUN 容器构建需要运行的命令

EXPOSE 当前容器对外暴露的端口

WORKDIR 指定在创建容器后,终端默认登录的工作目录

ENV 用来构建镜像过程中设置环境变量

ADD 将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar包

COPY 类似ADD,拷贝文件和目录到镜像中。<源路径>的文件/目录复制到新的一层镜像内的<目标路径>位置

VOLUME 容器数据卷,用于数据保存和持久化工作

CMD 指定一个容器启动时要运行的命令,DockerFile中可以有多个CMD命令,会被run 之后的命令覆盖。

ENTRYPOINT 指定一个容器启动时要运行的命令,ENTRYPOINT的目的和CMD一样,都是在指定容器启动程序及参数,不会被run之后的命令覆盖。

ONBUILD 当构建一个被继承的Dockerfile时运行命令,父镜像在被子继承后发镜像的onbuild会被触发

VOLUME添加数据卷

示例:

1.编写dockerFile

#volume test
FROM centos
VOLUME
CMD echo "finished,------success"
CMD /bin/bash
#翻译成上面的容器数据卷
#docker run -it -v /host1:/dataVolumeContainer1 -v /host2:/dataVolumeContainer2 centos /bin/bash

2.使用build 编译dockerFile

docker buiild -f /mydocker/DockerFile -t binxer/centos .	#结尾有 .
  • 使用 --volumes-from 实现数据卷共享

以上一步新建的镜像为模板运行容器dc01/dc02/dc03

docker run -it --name dc01 binxer/centos	#创建dc01 作为父容器
docker -it --name dc02 --volumes-from dc01 binxer/centos #创建dc02 链接dc01
docker -it --name dc03 --volumes-from dc01 binxer/centos #创建dc03 链接dc01

此时删除 dc01 数据卷也不会消失,因为数据卷的生命周期一直持续到没有容器使用它为止。

案例:自定义centos

自定义mycentos 使我们自己的镜像具备如下:

1.支持vim编辑器

2.支持ifconfig命令

FROM centos
MAINTAINER test@abc.com

ENV mypath /user/local
WORKDIR $MYPATH

RUN yum -y install vim
RUN yum -y install net-tools

EXPOSE 80

CMD echo $MYPATH
CMD echo "success-----------ok"
CMD /bin/bash

执行构建命令

docker build -t 新镜像名字:TAG .# 需要注意,结尾有 .

案例:自定义 tomcat9

1.mkdir -p /mydockerfile/tomcat9

2.在上述目录下 touch c.txt

3.将jdk和tomcat安装的压缩包拷贝进上一步目录apache-tomcat-9.0.37-deployer.tar.gz jdk-8u261-linux-x64.tar.gz

FROM centos
MAINTAINER bin0234<bin0234@foxmail.com>
# 把宿主机当前上下文的c.txt拷贝到容器/usr/local/路径下
COPY c.txt /usr/local/cincontainer.txt
# 把java与tomcat添加到容器中
ADD jdk-8u261-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-9.0.37.tar.gz /usr/local/
# 安装vim
RUN yum -y install vim
# 设置工作访问的WORKDIR路径,登录落脚点
ENV MYPATH /usr/local
WORKDIR $MYPATH
# 配置java与tomcat环境变量
ENV JAVA_HOME /usr/local/jdk1.8.0_261
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/75
ENV CATALINA_BASE /usr/local/apache-tomcat-9.0.37
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
# 容器运行时监听的端口
EXPOSE 8080
# 启动运行时tomcat
# ENTRYPOINT ["/usr/local/apache-tomcat-9.0.37/bin/startup.sh"]
# CMD ["/usr/local/apache-tomcat-9.0.37/bin/catalina.sh","run"]
CMD /usr/local/apache-tomcat-9.0.37/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.37/bin/logs/catalina.out
  • 执行build命令
docker build -t mytomcat9 .
  • 执行run命令,并添加数据卷映射webapps和logs
docker run -d -p 80:8080 --name mycat9 -v /mydockerfile/mytomcat9/webapps:/usr/local/apache-tomcat-9.0.37/webapps -v /mydockerfile/mytomcat9/logs:/usr/local/apache-tomcat-9.0.37/logs --privileged=true mytomcat9

常用安装

tomcat

docker search tomcat
docker pull tomcat
docker run -it -p 80:8080 tomcat 

mysql

docker search mysql
docker pull mysql:5.7 #拉取一个5.7版本的mysql
docker run -p 1234:3306 --name mysql -v /hostLocation/mysql/conf:/etc/mysql/conf.d -v /hostLocation/mysql/logs:/logs -v /hostLocation/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=1234556 -d mysql:5.7
# 命令说明
# -p 1234:3306 将主机1234端口映射到容器3306端口
# --name mysql 容器名字
# -v /hostLocation/mysql/conf:/etc/mysql/conf.d 将主机/hostLocation/mysql/conf/挂载到容器的/etc/mysql/conf.d
# -v /hostLocation/mysql/logs:/logs 将主机/hostLocation/mysql/logs 目录挂载到容器/logs
# -v /hostLocation/mysql/data:/var/lib/mysql 将主机/hostLocation/mysql/data 目录挂载到容器的/var/lib/mysql
# -e MYSQL_ROOT_PASSWOED=123456 初始化Root密码
# -d mysql:5.7 后台运行mysql5.6
docker exec -it MySQL运行成功后的容器ID /bin/bash

redis

docker search redis
docker pull redis:3.2
docker run -p 6379:6379 -v /myredis/data:/data -v /myredis/conf/redis.conf:/usr/local/etc/redis/redis.conf -d redis:3.2 redis-server /usr/local/etc/redis/redis.conf --appendonly yes

将镜像推送到 阿里云

  1. 登录阿里云Docker Registry
$ sudo docker login --username=你的id registry.cn-hangzhou.aliyuncs.com

用于登录的用户名为阿里云账号全名,密码为开通服务时设置的密码。

您可以在访问凭证页面修改凭证密码。

  1. 从Registry中拉取镜像
$ sudo docker pull registry.cn-hangzhou.aliyuncs.com/bin_playerground/study:[镜像版本号]
  1. 将镜像推送到Registry
$ sudo docker login --username=你的id registry.cn-hangzhou.aliyuncs.com
$ sudo docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/bin_playerground/study:[镜像版本号]
$ sudo docker push registry.cn-hangzhou.aliyuncs.com/bin_playerground/study:[镜像版本号]

请根据实际镜像信息替换示例中的[ImageId]和[镜像版本号]参数。

 类似资料: