docker
安装(centos)
文档地址:https://docs.docker.com/engine/install/centos/
1、卸载旧的版本
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
2、安装需要的包
yum install -y yum-utils
#设置docker仓库
yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo #默认地址,国外的,网速较慢
yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo #阿里云地址
3、安装最新版docker引擎
#docker-ce社区版,docker-ee企业版
yum install docker-ce docker-ce-cli containerd.io
#安装指定版本的docker
yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io
4、启动docker
systemctl start docker
#版本信息
docker version
5、helloworld
docker run hello-world
docker images #查看镜像信息
卸载
1、卸载依赖
yum remove docker-ce docker-ce-cli containerd.io
2、删除相关文件
rm -rf /var/lib/docker #/var/lib/docker是docker的默认工作路径
阿里云镜像加速
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://bvdmg5ef.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
常用命令
docker version #版本信息
docker info #详细信息
docker 命令 --help #帮助命令
docker images --help
Options:
-a, --all Show all images #展示所有的镜像
-f, --filter filter Filter output based on conditions provided
--format string Pretty-print images using a Go template
--no-trunc Don't truncate output
-q, --quiet Only show image IDs #只展
示id
docker search mysql #搜索,对应docker hub,地址:https://registry.hub.docker.com/
NAME DESCRIPTION STARS
mysql MySQL is a widely used, open-source relation… 10466
mariadb MariaDB is a community-developed fork of MyS… 3891
mysql/mysql-server Optimized MySQL Server Docker images. Create… 768
percona Percona Server is a fork of the MySQL relati… 526
docker pull mysql #从仓库下载mysql镜像,默认是最新版本,docker pull mysql:5.7(5.7版本)
Using default tag: latest
latest: Pulling from library/mysql
*
*
*
Digest: sha256:feada149cb8ff54eade1336da7c1d080c4a1c7ed82b5e320efb5beebed85ae8c
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest#docker pull mysql=docker pull docker.io/library/mysql:latest
docker rmi -f a70d36bc331a #删除指定id的镜像,docker rmi -f id id >>删除多个id
docker rmi -f $(docker images -aq) #删除所有的镜像
docker run 参数 镜像
--name="mysql01" #容器名称
-d #后台运行,如果直接后台运行但是后面又没有任务的话,这个启动了就直接停止了
-it #使用交互方式运行,进入容器查看内容,docker run -it mysql /bin/bash(使用exit停止退出或者ctrl+p+q不停止退出)
-P #指定容器端口 -P 8080:8080 主机端口:容器端口
-p #随机指定端口
docker ps #列出在运行的容器
-a #曾经运行的全部容器
-q #显示id
docker rm id #删除指定的容器,只能删除没有运行的容器
docker rm -f id #删除指定的容器,直接强制删除
docker start id #启动docker run启动时其实有两步操作,先是创建,然后再是启动
docker restart id #重启
docker stop id #通知
docker kill id #杀掉
docker logs -tf --tail 10 1485b8fbc3a8 #日志输出
docker top id #进程信息
docker inspect id #所有信息
docker exec -it id /bin/bash #进入容器
docker attach id #进入的是正在运行的控制台、
docker cp id:路径(容器) 路径(本地) #从容器里面拷贝出来
安装nginx
#1、拉取镜像
docker pull nginx
#2、启动
docker run -d --name nginx1 -p 6379:80 nginx
#3、访问测试
http://8.131.95.101:6379/
Welcome to nginx!#成功
#--rm就是用完即停,可以做测试用
docker run -it --rm -p 6379:8080 tomcat:9.0#启动tomcat
docker run -d -p 6379:8080 tomcat:9.0#启动tomcat
docker exec -it e693f3be00ec /bin/bash#进入容器
cp -r webapps.dist/* webapps#注意,tomcat的包默认是最小的,里面是没有的默认的东西了,在webapps.dist有
http://8.131.95.101:6379/#测试成功
commit
docker run -it -p 6379:8080 tomcat:9.0 #启动tomcat
docker exec -it 75d6caf4c325 /bin/bash #进入容器
cp -r webapps.dist/* webapps #拷贝webapps的东西
#提交镜像 -a作者 -m信息
docker commit -a="xiaozhu" -m="add web app" 75d6caf4c325 tomcat02:1.0
docker run -d -p 6379:8080 tomcat02:1.0 #启动成功。默认就有tomcat的欢迎页面
数据卷
#启动tomcat -v挂载,本机/docker/tomcat02目录映射到容器的/home目录,完成文件同步,修改本地数据容器里面的数据也会改变
docker run -it -v /docker/tomcat02:/home -p 6379:8080 tomcat02:1.0 /bin/bash
#启动mysql -e 环境配置 --name 容器名字
docker run -d -p 3306:3306 -v /docker/mysql/conf:/etc/mysql/conf.d -v
/docker/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql
#本地使用数据库工具连接测试成功
#使用工具新建一个数据库docker
#然后在服务器本地的data里面新加了一个docker文件夹,说明映射成功
如果将容器删除,挂载到本地的数据也不会丢失
-v 容器内路径 匿名挂载
-v 卷名:容器内路径 具名挂载
-v /宿主机路径:容器内路径 指定路径挂载
-v 卷名:容器内路径 :ro 只读readonly 只能通过宿主机改变,不能在容器内部改变
-v 卷名:容器内路径 :rw 读写readwrite
dockerfile
#dockerfile文件
FROM nginx
VOLUME ["volume01","volume02"]
CMD echo "----end----"
CMD /bin/bash
#构建镜像,最后面的一个点一定要加上
docker build -f dockerfile1 -t nginx:1.0 .
#启动自己构建的nginx镜像
docker run -it nginx:1.0 /bin/bash
发现在构建镜像的时候把挂载的两个目录也构建进来了,在volume01里面新建一个test.txt文件,另外打开一个连接查看详细信息docker inspect e131d7e06493
所有的挂载默认在var/lib/docker/volumes
下面,因为是匿名挂载,所以生成了随机码
进入上面挂载的目录cd /var/lib/docker/volumes/77cb9e0d03371584aa4cc6c8c88addcfca9a31eecad1bae262de099228014b96/_data
发现也有一个test.txt,挂载成功
容器数据挂载
#--volumes-from 可以继承其他容器的挂载
docker run -it --name docker01 nginx:1.0
docker run -it --name docker02 --volumes-from docker01 nginx:1.0
docker ps #发现启动了两个容器
docker attach dcfd4190c983 #进入docker01里面呢, 在volume01目录下touch docker01
docker attach 1220705d4d07 #进入docker02里面呢, 在volume01目录下发现自动同步了docker01
docker run -it --name docker03 --volumes-from docker01 nginx:1.0 #在新建一个容器docker03,发现启动时在volume01目录下就已经有docker01了
现在有三个容器在启动,其中docker02和docker03继承与docker01,这时我们听到docker01,发现docker02和docker03的数据还在,
dockerfile详解
dockerfile就是构建镜像的文件
命令:
- 每一个关键字都是大写的
- #表示注释
- 每一个指令都会创建提交一个新的镜像层,并提交
FROM #基础镜像
MAINTAINER #镜像是谁写的,姓名+邮箱
RUN #镜像构建的时候需要运行的命令
ADD #添加内容
WORKDIR #镜像的工作目录
VOLUME #挂载的目录
EXPOST #暴露端口
CMD #指定这个容器启动的时候运行的命令,只有最后一个生效,可被替代
ENTRYPOINT #指定这个容器启动的时候运行的命令,可以追加命令
ONBUILD #当构建一个被继承 dockerfile 这个时候就会运行ONBUILD 的指令,触发指令
COPY #类似ADD,将我们文件拷贝到镜像中
ENV #构建的时候设置环境变量
构建centos镜像
1、编写自己的dockerfile
FROM centos
MIANTAINER xiaozhu<1778815369@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
2、构建镜像
#-f fockerfile文件 -t 镜像名:[tag]
docker build -f mydockerfile -t centos:0.1 .
Successfully built 46e4cf26012a
Successfully tagged centos:0.1
3、运行自己构建的镜像
docker run -it centos:0.1
#测试,直接进入工作目录,ifconfig和vim命令都有了
[root@9f069968bd9d local]# pwd
/usr/local
[root@9f069968bd9d 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 12 bytes 976 (976.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
#可以通过 docker history 命令查看镜像构建过程
[root@xiaozhu dockerfile]# docker history centos:0.1
IMAGE CREATED CREATED BY SIZE COMMENT
46e4cf26012a 7 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "/bin… 0B
874ce59309b3 7 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "echo… 0B
1b6e70deac61 7 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "echo… 0B
5013faac6995 7 minutes ago /bin/sh -c #(nop) EXPOSE 80 0B
fa43c1a6ec76 7 minutes ago /bin/sh -c yum -y install net-tools 23.3MB
ebf471faf3a5 7 minutes ago /bin/sh -c yum -y install vim 58.1MB
b46655dcf92a 21 minutes ago /bin/sh -c #(nop) WORKDIR /usr/local 0B
aad91ac95274 21 minutes ago /bin/sh -c #(nop) ENV MYPATH=/usr/local 0B
ceddd61c605a 21 minutes ago /bin/sh -c #(nop) MAINTAINER xiaozhu<177881… 0B
300e315adb2f 2 months ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B
<missing> 2 months ago /bin/sh -c #(nop) LABEL org.label-schema.sc… 0B
<missing> 2 months ago /bin/sh -c #(nop) ADD file:bd7a2aed6ede423b7… 209MB
CMD 构建时使用CMD命令,在启动容器时如果在后面添加了命令会把CMD命令覆盖掉
ENTRYPOINT 构建时使用ENTRYPOINT命令,在启动容器时如果在后面添加了命令会直接ENTRYPOINT命令后面添加命令
构建tomcat镜像
1、准备tomcat压缩包,jdk压缩包
[root@xiaozhu tomcat]# ll
total 151004
-rw-r--r-- 1 root root 11483588 Feb 9 10:17 apache-tomcat-9.0.43.tar.gz
-rw-r--r-- 1 root root 143142634 Feb 9 10:17 jdk-8u271-linux-x64.tar.gz
2、编写Dockerfile
FROM centos
MAINTAINER xiaozhu<1778815369@qq.com>
COPY readme.txt /usr/local/readme.txt
ADD jdk-8u271-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-9.0.43.tar.gz /usr/local/
ENV MYPATH /usr/local
WORKDIR $MYPATH
ENV JAVA_HOME /usr/local/jdk1.8.0_271
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.43
ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.43
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
EXPOSE 8080
CMD /usr/local/apache-tomcat-9.0.43/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.43/logs/catalina.out
3、构建镜像
docker build -t mytomcat:1.0 .
Successfully built a39820ee90a0
Successfully tagged mytomcat:1.0
4、启动镜像
docker run -d -p6379:8080 --name mytomcat01 mytomcat:1.0
在外面访问没问题,查看日志也没问题
发布镜像
1、注册账号
2、服务器上面登录我们的账号
[root@xiaozhu tomcat]# docker login --help
Usage: docker login [OPTIONS] [SERVER]
Log in to a Docker registry.
If no server is specified, the default is defined by the daemon.
Options:
-p, --password string Password
--password-stdin Take the password from stdin
-u, --username string Username
[root@xiaozhu tomcat]# docker login -u zhugl
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
3、发布
docker push zhugl:mytomcat:1.0
发布到阿里云
1、到阿里云镜像服务里面创建命名空间
2、创建镜像仓库
创建时选择本地仓库
3、点击创建的镜像仓库,跟着操作步骤一步一步的完成
在使用"docker tag"命令重命名镜像,一定要注意是docker账号开头
比如说我的docker账号是zhugl、
docker tag fa63a27ef15c zhugl/nginx:1.0