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 推送到阿里云
- 开发者平台 https://dev.aliyun.com/search.html
- https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
- 点击创建命名空间
- 创建镜像仓库, 代码源选本地仓库, 创建成功点击管理里面有推送方法
$ 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:[镜像版本号]