Docker笔记(一)

1、环境准备

1.1 检查linux版本

支持centos6.5以上(最好是7以上)

要求内核版本为2.6.32-431或者更高版本,输入命令查看:

uname -r

1.2 概念

镜像(image):类似于“class”

容器(container):类似于对象,只要有一个镜像,就可以new多个容器。可以把每一个容器都看作是精简版的linux环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的程序。

仓库(repository):集中存放镜像的场所,最大的仓库为

https://hub.docker.com

1.3 安装

官网教程:https://docs.docker.com/engine/install/centos/

安装前准备:建议更换yum源为国内镜像

安装如下:

1.3.1添加docker仓库至yum

yum install -y yum-utils

yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo

1.3.2安装最新版

sudo yum install docker-ce docker-ce-cli containerd.io

ceontos8

sudo yum install docker-ce docker-ce-cli containerd.io --nobest

1.3.3安装指定版本s

查看版本列表
yum list docker-ce --showduplicates | sort -r

将version——string替换为相应版本
yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io

1.3.4 镜像加速

阿里云镜像加速官网:

https://cr.console.aliyun.com/

阿里云加速地址:

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["每个人不一样"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

腾讯云加速

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://mirror.ccs.tencentyun.coms"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

官方加速

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://registry.docker-cn.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

2、基本命令

2.1 images相关

2.1.1 docker images

查看所有镜像

REPOSITORY 镜像的仓库源
TAG        镜像的标签
IMAGE ID   镜像的id
CREATED    镜像的创建时间
SIZE       镜像的大小

条件搜索,过滤部分镜像

docker -mysql --filter=STARS=9000 #表示只搜索stars大于9000的

2.1.2 docker pull

docker pull 镜像名【:tag】

docker pull mysql #如果不指定tag,则表示默认下载最新的

[root@iZwz9cc9df2x1jeu9hkhltZ ~]# docker pull mysql
Using default tag: latest
latest: Pulling from library/mysql
6ec8c9369e08: Pull complete 
177e5de89054: Pull complete 
ab6ccb86eb40: Pull complete 
e1ee78841235: Pull complete 
09cd86ccee56: Pull complete 
78bea0594a44: Pull complete 
caf5f529ae89: Pull complete 
cf0fc09f046d: Pull complete 
4ccd5b05a8f6: Pull complete 
76d29d8de5d4: Pull complete 
8077a91f5d16: Pull complete 
922753e827ec: Pull complete 
Digest: sha256:fb6a6a26111ba75f9e8487db639bc5721d4431beba4cd668a4e922b8f8b14acc
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest

注意:这里的 docker pull mysql 等价于 docker pull docker.io/library/mysql:latest

如果指定版本(标签号):

[root@iZwz9cc9df2x1jeu9hkhltZ ~]# docker pull mysql:5.7
5.7: Pulling from library/mysql
6ec8c9369e08: Already exists 
177e5de89054: Already exists 
ab6ccb86eb40: Already exists 
e1ee78841235: Already exists 
09cd86ccee56: Already exists 
78bea0594a44: Already exists 
caf5f529ae89: Already exists 
4e54a8bcf566: Pull complete 
50c21ba6527b: Pull complete 
68e74bb27b39: Pull complete 
5f13eadfe747: Pull complete 
Digest: sha256:97869b42772dac5b767f4e4692434fbd5e6b86bcb8695d4feafb52b59fe9ae24
Status: Downloaded newer image for mysql:5.7
docker.io/library/mysql:5.7

注意:这里的标签号是从官网查的:https://hub.docker.com/_/mysql, 不是瞎填的

说明:第二次下载的时候,很多是Already exists ,是因为docker是分层下载的,很多东西如果之前已经下载完成了,就不用继续下载了,可以共用。

2.1.3 docker rmi

删除镜像

删除镜像前,可以 docker image查询 id

[root@iZwz9cc9df2x1jeu9hkhltZ ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
mysql               5.7                 8679ced16d20        9 days ago          448MB
mysql               latest              e3fcc9e1cc04        9 days ago          544MB
hello-world         latest              bf756fb1ae65        7 months ago        13.3kB

然后使用命令:

docker rmi -f  e3fcc9e1cc04 

如果想要删除多个容器

docker rmi -f $(docker images -aq)

2.1.3 docker commit

docker commit 用于增强镜像,亦可以理解为“修改”原有的镜像,或者将此刻状态的容器保存为新的快照。

例如本地有一个镜像centos7,默认情况下是没有vim工具的。所以我创建了一个容器实例,并进入容器安装了vim(相关命令后面会有)。

如何保存当前容器实例,并生成新的镜像呢?
commit只需要退出容器,执行命令

docker commit -m="centos add vim" -a="dayrain" 16ce457bba9d dayrain/mycentos:7.1

即可生成新的镜像
新的镜像
命令的含义如下

docker commit -m="备注" -a="作者"  原容器ID  镜像名

2.2container相关

2.2.1 docker run

产生一个新的容器,而docker start 是

docker run [可选参数] image
--name="Name" 容器名字 ,用来区分容器
-d  后台方式运行
-it  使用交互方式运行, 进入容器查看内容
-p   指定容器的端口 -p 8080:8080
       -p ip:主机端口:容器端口
       -p 主机端口:容器端口(常用)
       -p 容器端口
       容器端口
 -P   随机指定端口

进入centos

docker run -it centos /bin/bash

exit

2.2.2 docker ps

docker ps      当前正在运行的容器

-a             当前正在运行的容器 + 历史运行过的容器
-n=?           显示最近创建的容器
-q             只显示容器

2.2.3 退出容器

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

2.2.4删除容器

docker rm 容器id               #删除指定容器
docker rm -f  $(docker ps -aq)  #删除所有容器

2.2.4启动和停止容器

docker start 容器id      
docker restrat 容器id
docker stop 容器id      #停止正在运行的容器
docker kill 容器id       #强制停止当前容器

技巧:如果启动容器后自动退出(加了-d之后),则可以通过命令:tail -f /dev/null 使容器保持运行状态。

2.2.5查看容器日志

docker logs -tf d8b6b342814e
docker logs -tf d8b6b342814e --tail 10

2.2.6 查看容器中的进程信息

要求:该容器必须正在运行

docker top d8b6b342814e

2.2.7查看容器中的元数据

docker inspect d8b6b342814e

2.2.8 进入当前正在运行的容器

方式一:

docker exec -it d8b6b342814e /bin/bash

方式二:

docker attach d8b6b342814e

区别:

方式一 是开启一个新的终端

方式二 接着正在执行任务的那个终端

2.2.9 将容器内的文件拷贝到容器外

docker cp d8b6b342814e:/home/hello.txt /home

2.2.10 容器生成镜像

docker commit -a "个人信息" -m "说明" [imageId]  [新的镜像名]:v1 

2.2.11 容器间映射(–link)

–link会在hosts文件加一条映射

启动容器,第一个mynginx指的是进入容器后,输入mynginx就可以表示 后面一个 mynginx的ip

docker run -dit --link mynginx:mynginx alpine

3、安装软件

3.1 安装nginx

下载镜像

docker pull nginx

运行容器

docker run -d --name "nginx01" -it -p 80:80 nginx

查看ip的小技巧

如果ifcofig命令不能用

cat /etc/hosts

3.2 安装tomcat

方式一:用完即删

 docker run -it --rm tomcat:9.0   #该方法一般用来测试,用完后会自动删除

停止后,docker ps就没有了

方式二:常规方式

docker pull tomcat:9.0

docker run -d --name 'tomcattest01' -p 8080:8080 tomcat

访问后会出现404,是因为webapp下没有文件,docker安装的tomcat是最精简版的。

3.3 安装图形化工具

docker run -d -p 8000:8000 -p 9000:9000 --name=portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer

3.4 安装mysql

docker pull mysql:5.7

-e表示配置环境变量

docker run -d --name mysql57 -p 3306:3306 -v /home/dayrain/docker/mysql/conf:/etc/mysql/conf.d -v /home/dayrain/docker/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root mysql:5.7 

3.5安装redis

1、下载镜像

docker pull redis:6

2、创建本地挂载目录

/home/dayrain/docker/redis/conf

/home/dayrain/docker/redis/data

3、写配置文件

位于conf目录下的redis.conf

#bind 127.0.0.1 
protected-mode no
appendonly yes
requirepass 密码

4、运行redis

docker run -d --name myredis -v /home/dayrain/docker/redis/data:/data -v /home/dayrain/docker/redis/conf/redis.conf:/etc/redis/redis.conf  -p  6379:6379 redis:6 redis-server /etc/redis/redis.conf

5、登录

 docker exec -it myredis redis-cli

如果需要验证

auth 密码

4、容器数据卷

4.0 权限问题

如果在挂载的过程中,如果出现"permission denied"等字样,则需要在挂在目录后加上参数:
–privileged=true

4.1 简单操作

容器的持久化和同步操作,可将数据永久保存在本地,并且可以实现容器之间的数据共享。

实现:

将本机home下的ceshi目录,挂载到容器的home下。之后本机的目录与容器的home会共享空间

docker run -it -v /home/ceshi:/home 831691599b88 /bin/bash

4.2 匿名挂载

docker run -d -p 80:80 --name nginx01 -v /etc/nginx nginx

查看数据卷

docker volume ls

4.3 具名挂载

 docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx

查看数据卷

docker volume ls

查看数据卷位置

docker volume inspect juming-nginx

4.4 指定权限

#只读
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:ro nginx

#可读可写
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:rw nginx

4.5 实现mysql容器间数据共享

docker run -d -P --name mysql02 -v /etc/mysql/conf.d -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=Ph0716 mysql:5.7

docker run -d -P --name mysql03 --volumes-from mysql02  -e MYSQL_ROOT_PASSWORD=Ph0716 mysql:5.7

4.6 删除数据卷

docker volume rm my-vol

删除无主数据卷(会删除所有,慎用)

docker volume prune

5、DockerFIle

dockerfile是用来构建docker镜像的文件,是一个命令参数脚本

5.1 构建步骤

1、编写一个dockerfile文件

2、dockerbuild构建成为一个镜像

3、docker run 运行镜像

4、docker push发布镜像(DockerHub、阿里云镜像仓库)

5.2 指令

FROM        #基础镜像,一切从这构建
MAINTAINER  #镜像谁写的,姓名+邮箱
RUN         #镜像构建的时候需要运行的命令
ADD         #将宿主主机的文件拷贝进镜像且ADD命令或自动处理URL和解压tar包
WORKDIR     #镜像的工作目录,就是创建完容器后,从终端默认登录进来的工作目录,相当于落脚点
VOLUME      #容器数据卷,主要为了保存在数据和持久化工作,挂载目录
EXPOST      #当前容器对外暴露的端口号
CMD         #指定容器启动时运行的命令,只有最后一个有效,可以被替代
ENTRYPOINT  #指定容器启动时运行的命令,可以追加命令,可以有多个(区别于cmd)
ONBUILD     #触发指令,了解即可
COPY        #类似ADD,将文件拷贝到镜像中,
ENY         #构建的时候设置环境变量

CMD指令需要特别注意下
1、如果有多个CMD,则只有最后一个CMD生效。
2、CMD是容器启动的时候执行。
3、当使用ENTRYPOINT 时,CMD不再是作为一种命令来运行,而可以作为ENTRYPOINT 的参数。(ENTRYPOINT 在CMD之前)
4、CMD命令可被启动容器时追加的命令替换。
以tomcat官方镜像为例,tomcat启动时依赖一个启动脚本
在这里插入图片描述

如果我们使用命令 docker run -it tomcat /bin/bash 启动tomcat,
会覆盖原有的CMD命令,导致默认的shell脚本无法执行。

【注意,这里的-it是docker本身的参数,不会覆盖。而/bin/bash是启动后执行的“命令”,会覆盖】

5.3 实战:制作CentOS镜像

编写dockerfile文件

FROM centos
MAINTAINER dayrain<XXXXXXXX@qq.com>

ENV MYPATH /usr/local
WORKDIR $MYPATH

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

EXPOSE 80

CMD echo $MYPATH
CMD echo "----end----"
CMD /bin/bash

编译构建

点不要忘了加

 docker build -f mydockerfile-centos -t mycentos:0.1 .

创建容器

docker run -it  mycentos:0.1

5.4 实战:制作tomcat镜像

1、第一步:将jdk、tomcat的压缩包拷贝到当前文件夹

/home/dayrain/build/tomcat

apache-tomcat-9.0.37.tar.gz 
jdk-8u261-linux-x64.tar.gz

2、在当前文件夹写Dockerfile

无注释版

FROM centos
MAINTAINER  dayrain<XXXXXXXXX@qq.com>

COPY readme.txt /usr/local/readme.txt

ADD jdk-8u261-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-9.0.37.tar.gz /usr/local/

RUN yum -y install vim
ENV MYPATH /usr/local
WORKDIR $MYPATH

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/apache-tomcat-9.0.37
ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.37
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
ENV JAVA_OPTS "-Djava.security.egd=file:/dev/./urandom"

EXPOSE 8080



CMD /usr/local/apache-tomcat-9.0.37/bin/startup.sh && tail -F /url/local/apache-tomcat-9.0.37/bin/logs/catalina.out


有注释版

FROM centos
MAINTAINER  dayrain<XXXXXXXXXX@qq.com>

#如果需要把文件拷贝到容器内,可以用COPY	
COPY readme.txt /usr/local/readme.txt

#会自动解压
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

#这两步设置进入容器后,默认在的目录
ENV MYPATH /usr/local
WORKDIR $MYPATH

#设置各种环境变量
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/apache-tomcat-9.0.37
ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.37
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
#解决linux上tomcat启动的问题
ENV JAVA_OPTS "-Djava.security.egd=file:/dev/./urandom"


#暴露端口
EXPOSE 8080


#启动容器的时候同时启动tomcat
CMD /usr/local/apache-tomcat-9.0.37/bin/startup.sh && tail -F /url/local/apache-tomcat-9.0.37/bin/logs/catalina.out

3、构建镜像

docker build -t mytomcat:0.1 .

4、运行容器

#-d 表示后台运行
#-p 表示端口映射
#--name 名称
# -v挂载本地目录到容器中,:前面表示本地目录,后面表示其他目录

docker run -d -p 8080:8080 --name mytomcat01 -v /home/dayrain/build/mytomcat/webapps:/usr/local/apache-tomcat-9.0.37/webapps  -v /home/dayrain/build/mytomcat/logs/:/usr/local/apache-tomcat-9.0.37/logs mytomcat01:0.1

5.5 虚悬镜像

指的是没有仓库名或者没有标签名的镜像。

出现虚悬镜像的原因一般是在docker pull **:latest 时产生。当新版本发布后重新pull,旧的镜像名会被新镜像所占用,旧镜像的名字会变成

查看悬虚镜像
docker image ls -f dangling=true
删除悬虚镜像
docker image prune

6、提交镜像到云端

6.1 提交到Dockerhub

1、登录账号

docker login -u 用户名      #输入密码

2、命名规范

命名不规范将无法上传,比如用户名是 dayrain, 那镜像名必须是 “dayrain/”开头, 例如:dayrain/tomcat:1.0

通过tag命令修改

docker tag mytomcat:1.0 dayrain/tomcat:1.0

3、提交

docker push dayrain/tomcat:1.0

7、导出镜像

7.1 导出镜像

docker save -o [导出后的文件名] [镜像名]

docker save -o /home/dayrain/dockerimages/tomcat.docker dayrain/tomcat

7.2 导入镜像

docker load --input 文件	


或者

docker load -i 文件	

或者

docker load < 文件名
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值