docker之无障碍从0到1

1 帮助命名

1.1 docker version

[root@localhost]~# docker version
Client: Docker Engine - Community
 Version:           19.03.0-rc3
 API version:       1.40
 Go version:        go1.12.5
 Git commit:        27fcb77
 Built:             Thu Jun 20 02:02:37 2019
 OS/Arch:           linux/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          19.03.0-rc3
  API version:      1.40 (minimum version 1.12)
  Go version:       go1.12.5
  Git commit:       27fcb77
  Built:            Thu Jun 20 02:01:10 2019
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.2.6
  GitCommit:        894b81a4b802e4eb2a91d1ce216b8817763c29fb
 runc:
  Version:          1.0.0-rc8
  GitCommit:        425e105d5a03fabd737a126ad93d62a9eeede87f
 docker-init:
  Version:          0.18.0
  GitCommit:        fec3683

1.2 docker info


1.3 docker help

2 容器命令

2.1 docker images

  • -a 列出本地所有镜像(含中间映象层)
  • -q 只显示镜像ID
  • –digests 显示镜像摘要信息
  • –no-trunc 显示完整的镜像信息

2.1 docker search [option] 镜像名

  • docker search 名字
  • docker searcch --no-trunc 显示完整的镜像描述
  • docker search -s 列出收藏数不小于指定值的镜像
  • docker search --automated 只列出automate build类型的镜像

2.2 docker pull 镜像名

  • docker pull tomcat 等于 docker pull tomcat:latest

2.3 docker rmi 镜像名id

  • docker rmi hello-world:3.2 不写则是latest 删除3.2版本hello-world
  • docker rmi -f 镜像名 (删除单个)
  • docker rmi -f 镜像名1:TAG 镜像名2:TAG (删除多个)
  • docker rmi -f $(docker images -qa) (删除全部)

3 容器命令

  • 有镜像才有容器

docker pull centos

3.1 docker run 新建并启动容器

docker run [options] IMAGE [command] [arg...]

  • options (常用的是 -i -t)

    • –name=“容器新名字”: 为容器指定一个名称
    • -d 后台运行容器, 并返回容器ID, 也即启动守护式容器
    • -i 以交互模式运行容器, 通常与-t同时使用
    • -t 为容器重新分配一个伪输入终端, 通常与-i同时使用
    • -P 随机端口映射
    • -p 指定端口映射,
      • ip:hostPort:containerPort
      • ip::containerPort
      • hostPort:containerPort
      • containerPort
  • 例如 docker run -it --name myapp “IAMGE ID或docker名” (运行成功之后返回一个命令终端我要与该docker进行交互)

例如: 启动一个centos

[root@localhost]~# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              latest              9f38484d220f        3 months ago        202MB
hello-world         latest              fce289e99eb9        5 months ago        1.84kB

docker run -it 9f38484d220f --name
控制台输出

[root@localhost]~# docker run -it 9f38484d220f
此时已经进入docker启动的centos的系统根目录, 而不是在原系统中
[root@6737f2fbc1e1 /]#

查看当前启动的docker
docker ps

[root@localhost]~# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS              PORTS               NAMES
6737f2fbc1e1        9f38484d220f        "/bin/bash"         About a minute ago   Up About a minute                       jolly_brahmagupta

退出 exit

  • docker run -it -p 8080:8080 tomcat
    • -p 主机端口:docker容器端口
    • -P 随机分配端口
    • i 交互
    • t 终端

3.2 docker ps 查看当前正在运行的docker

  • -a 列出当前所有正在运行的容器 + 历史上运行过的
  • -l 显示最近创建的容器
  • -n 显示最近n个创建的容器
  • -q 静默模式, 只显示容器编号
  • –no-trunc 不截断输出

3.3 退出docker

  • exit (容器停止并退出)
[root@6737f2fbc1e1 /]# ps -ef
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 06:44 pts/0    00:00:00 /bin/bash
root        14     1  0 06:45 pts/0    00:00:00 ps -ef
# 6737f2fbc1e1是容器实例的id
[root@6737f2fbc1e1 /]# exit
# exit
# 退出了docker里的centos
[root@localhost]~#
  • ctl + P + Q 容器不停止退出

3.4 启动停止和重启

# 启动centos
[root@localhost]~# docker run -it centos
# 进入了docker里的centos终端, ctl + P + Q容器不停止退出
[root@5a637d7ceb32 /]# #                                                                                                                           
# 查看正在运行的docker, centos状态是up, 所以没有停止
[root@localhost]~# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS              PORTS               NAMES
5a637d7ceb32        centos              "/bin/bash"         About a minute ago   Up About a minute                       busy_curran
[root@localhost]~#
# 重启docker里的centos
[root@localhost]~# docker restart 5a637d7ceb32
5a637d7ceb32
[root@localhost]~# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
5a637d7ceb32        centos              "/bin/bash"         5 minutes ago       Up 3 seconds                            busy_curran
[root@localhost]~#
# 软停止docker 
[root@localhost]~# docker stop 5a637d7ceb32
5a637d7ceb32
[root@localhost]~# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
[root@localhost]~#
# 强制停止docker
[root@localhost]~# docker kill 5a637d7ceb32
5a637d7ceb32
[root@localhost]~# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
[root@localhost]~#

3.5 一次性删除多个容器

  • docker rm -f $(docker ps -a -q)
  • docker rm -f $(docker ps -q) 删除正在运行的容器
  • docker ps -a -q | xargs docker rm

3.6 查看容器运行日期docker log 容器id

3.7 docker attch/exec 进入容器

  • docker attch containerId (进入containerId这个容器, 不会启动新的进程)
  • docker exec -it containerId ls -la /tmp (在containerId这个容器, 在里面的/tmp文件夹里执行ls -la并打印结果, 事实并没有进入容器, 只是在外面执行. 在容器中打开新的终端, 并且可以启动新的进程)

3.8 docker cp 容器里的文件拷贝到宿主机

  • docker cp containerId:/tmp/test.js /root

3.9 docker commit

  • 提交容器副本使之成为一个新的镜像
  • docker commit -m=“提交的描述信息” -a=“作者” 容器ID 镜像名:标签名
  • 如: docker commit -a=“这是我的” -m=“jack” 容器ID myapp:1.2

3.10 docker容器数据卷

容器关闭之后, 仍然让数据保存
主要作用是持久化

  • 特点
    • 数据卷可在容器之间共享或重用数据
    • 卷中的更改可以直接生效
    • 数据卷中的更改不会包含在镜像的更新中
    • 数据卷的生命周期一直持续到没有容器使用它为止

3.11 宿主机和容器数据共享

  • docker run -it -v /dataMain:/dataContainer 容器名
    • 容器关闭, 在主机里改变dataMain里的文件, 再起开启容器文件依然会同步
  • docker run -it -v /dataMain:/dataContainer:ro 容器名
    • 容器内的dataContainer目录是只读内容, 主机不能写入文件

3.12 数据卷容器

  • 命名的容器挂载数据卷, 其他容器通过挂载这个(父容器)实现数据共享, 挂载数据卷的容器, 称之为数据卷容器

  • docker run -it --name doc01 zzyy/centos

  • docker run -it --name doc02 --volumes-from dc01 zzyy/centos

  • docker run -it --name doc03 --volumes-from dc01 zzyy/centos

  • doc01的文件会自动同步到doc02和doc03

  • 删除doc01后, 改变doc02依然会同步到doc03

  • 结论: 容器之间配置信息的传递, 数据卷的生命周期一直持续到没有容器使用它为止

4 docker file

  • dockerfile是用来构建docker镜像的构建文件, 是由一系列命令和参数构成的脚本

4.1 dockerfile构建过程解析

基础:

  • 每条保留字指令都必须为大写字母且后面要跟随至少一个参数
  • 指令按照从上到下顺序执行
  • # 表示注释
  • 每条指令都会创建一个新的镜像层, 并对镜像进行提交

流程:

  • docker从基础镜像运行一个容器
  • 执行一条指令并对容器作出修改
  • 执行类似docker comit的操作提交一个新的镜像层
  • docker再基于刚提交的镜像运行一个新容器
  • 执行dockerfile中的下一条指令直到所有指令都执行完成

[外链图片转存失败(img-Gfj68JPO-1563115675260)(evernotecid://FA5E6CEE-F4F3-444D-B560-2DD2540613B7/wwwevernotecom/192820466/ENResource/p458)]

4.2 保留字指令

  • FROM 基础镜像, 当前新镜像是基于那个镜像
  • MAINTAINER 镜像维护者的姓名和邮箱地址
  • RUN 容器构建时需要运行的命令
  • EXPOSE 当前容器对外暴露出的端口
  • WORKDIR 指定在创建容器后, 终端默认登录进来的工作目录, 一个落脚点
  • ENV 用来在构建镜像过程中设置环境变量
  • ADD 将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar压缩包
  • COPY 类似ADD, 拷贝文件和目录到镜像中, 将从构建上下文目录中<源路径>的文件/目录复制到新的一层的镜像内的<目标路径>位置
    • COPY sec dest
    • COPY [“src”, “dest”]
  • VOLUME 容器数据卷 , 用于数据保存和持久化工作
  • CMD
    • 指定一个容器启动时要运行的命令
    • dockerfile中可以有多个CMD指令, 但只有最后一个生效, CMD会被docker run之后的参数替换
  • ENTRYPOINT
    • 指定一个容器启动时要运行的命令
    • ENTRYPOINT的目的和CMD一样, 都是在指定容器启动程序及参数
  • ONBUILD 当构建一个被继承的dockerfile时运行命令, 父镜像在被子继承后父镜像的onbuild被触发

4.3 自定义镜像

  • 编写dockfile
  • 构建 docker build -t 新镜像名字:tag . (点表示当前路径)
  • 运行
  • 列出镜像的变更历史

4.3 案例-自定义mycentos使镜像具备vim, ifconfig功能

  • 1 编写dockerfile
# 继承自本地镜像centos
FROM centos
# 作者
MAINTAINER  jack<888@163.com>
# 设置环境变量
ENV  MYPATH  /usr/local
# 设置登录之后所进入的目录, $MYPATH是环境变量, 值为"/usr/local"
WORKDIR  $MYPATH

# 安装vim
RUN yum -y install vim
# 安装net-tools以便能使用ifconfig
RUN yum -y install net-tools

EXPOSE 80

CMD echo $MYPATH
CMD echo "success---------ok"
CMD /bin/bash
  • 2 执行bbuild
# /root/mydocker/Dockerfile是dockerfile文件
docker build -f /root/mydocker/Dockerfile -t mycentos:1.0 .
  • 3 检查是否成功
[root@localhost]~/mydocker# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
mycentos            1.0                 0781ba727bfd        4 minutes ago       466MB
centos              latest              9f38484d220f        3 months ago        202MB
hello-world         latest              fce289e99eb9        5 months ago        1.84kB
  • 4 运行
    执行 docker run -it mycentos:1.0
[root@localhost]~/mydocker# docker run -it mycentos:1.0
[root@4cf841f7e725 local]# pwd   #直接进入了/usr/local目录
/usr/local
[root@4cf841f7e725 local]#
[root@4cf841f7e725 local]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.0.2  netmask 255.255.0.0  broadcast 172.17.255.255
        ether 02:42:ac:11:00:02  txqueuelen 0  (Ethernet)
        RX packets 8  bytes 656 (656.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

[root@4cf841f7e725 local]#

4.4 案例-自定义Tomcat

  • 1 编写dockerfile
FROM  centos
MAINTAINER  jack<jack@163.com>
# 把宿主机当前上下文的c.txt拷贝到容器的/usr/local目录下
COPY c.txt  /usr/local/cincontainer.txt
# 把java与Tomcat添加到容器中
ADD jdk-8u171-linux-x64.tar.gz  /usr/local
ADD apache-tomcat-9.0.8.tar.gz  /usr/local
# 安装vim编辑器
RUN yum -y install vim
# 设置环境变量, 用于工作目录使用
ENV MYPATH /usr/local
WORKDIR  $MYPATH
# 配置java与Tomcat环境变量
ENV JAVA_HOME  /usr/local/jdk1.8.0_171
ENV CLASSPATH  $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME  /usr/local/apache-tomcat-9.0.8
ENV CATALINA_BASE  /usr/local/apache-tomcat-9.0.8
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:CATALINA_HOME/bin
# 容器运行时监听的端口
EXPOSE  8080
# 启动时运行Tomcat
# ENTRYPOINT ["/usr/local/apache-tomcat-9.0.8/bin/startup.sh"]
# CMD  ["/usr/local/apache-tomcat-9.0.8/bin/catalina.sh", "run"]
CMD /usr/local/apache-tomcat-9.0.8/binstartup.sh && tail -F /usr/local/apache-tomcat-9.0.8/bin/logs/catalina.out
  • 2 doocker build -t zzyytomcat9 .

    • 如果当前目录有Dockerfile, 则可以直接docker build
    • 当前目录必须包含两个文件 jdk-8u171-linux-x64.tar.gz apache-tomcat-9.0.8.tar.gz
      [外链图片转存失败(img-HkkvElZa-1563115675263)(evernotecid://FA5E6CEE-F4F3-444D-B560-2DD2540613B7/wwwevernotecom/192820466/ENResource/p459)]
  • 3 docker run

docker run -d -p 9080:8080 --name myt9 -v /zzyyuse/mydockerfile/tomcat9/test:/usr/local/apache-tomcat-9.0.8/webapps/test -v /zzyyuse/mydockerfile/tomcat9/tomcat9logs/:/usr/local/apache-tomcat-9.0.8/logs  --privileged=true  zzyytomcat9
# 命令讲解
# -d 在后台运行,  --name myt9 自定义一个名字myt9
docker run -d -p 9080:8080 --name myt9 
# 宿主机的目录和容器的目录共享
-v /zzyyuse/mydockerfile/tomcat9/test:/usr/local/apache-tomcat-9.0.8/webapps/test 
-v /zzyyuse/mydockerfile/tomcat9/tomcat9logs/:/usr/local/apache-tomcat-9.0.8/logs  
# 防止写权限不够
--privileged=true  
zzyytomcat9

5 docker常用安装

5.1 步骤

  • 搜索镜像
  • 拉取镜像
  • 查看镜像
  • 启动镜像
  • 停止镜像
  • 移除镜像

5.2 安装mysql

  • 查mysql: docker search mysql
  • 拉取: docker pull mysql:5.7.20
  • 查看镜像: docker iamges
  • 启动镜像 docker run -p 12345:3306 --name mysql -v /zzyyuse/mysql/conf:/etc/mysql/conf.d -v /zzyyuse/mysql/logs:/logs -v /zzyyuse/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7.20
  • 和mysql交互 docker exec -it containerID /bin/bash
    • mysql -uroot -p
  • 备份数据库
    • 在宿主机执行 docker exec containerID sh -c 'exec mysqldump --all-databases -uroot -p "123456"' > /zzyyuse/all-databases.sql

5.3 安装redis

  • 拉取: docker pull redis:3.2
  • 启动: docker run -p 6379:6379 -v /zzyyuse/myredis/data:/data -v /zzyyuse/myredis/conf/redis.conf:/usr/local/etc/redis/redis.conf -d redis:3.2 redis-serveer /usr/local/etc/redis/redis.conf --appendonly yes

5.3 安装gitlab

  • docker pull gitlab/gitlab-ce
  • 启动, 等待几分钟
docker run -d \
 --name gitlab \
 --hostname gitlab \
 --restart always \
 -p 4443:443 -p 8888:80 -p 2222:22 \
 -v /app/gitlab/config:/etc/gitlab \
 -v /app/gitlab/data:/var/opt/gitlab \
 -v /app/gitlab/logs:/var/log/gitlab \
 gitlab/gitlab-ce

6 本地镜像推送到阿里云

6.1 镜像的生成方法dockerfile

6.2 镜像的生成方法docker commit

在这里插入图片描述

6.3 推送到阿里云

$ sudo docker login --username=8*****6@qq.com registry.cn-hangzhou.aliyuncs.com
$ sudo docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/w/mycentos:[镜像版本号]
$ sudo docker push registry.cn-hangzhou.aliyuncs.com/w/mycentos:[镜像版本号]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值