docker安装
#方式一: 默认版本安装
yum install docker
#方式二:最新版本安装
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-re/linux/centos/docker-ce.repo
yum install docker-ce
#注意:CentOS6并没有docker源,可以使用EPEL库安装docker
yum install http://mirros.yun-idc.com/epel/6/i386/epel-release-6-8.noarch.rpm
yum install docker-io
docker常用命令
#查看docker版本信息
docker version
docker info
#启动docker
systemctl start docker
service docker start
#设置随机启动
chkconfig docker on
容器操作
docker [run|start|stop|restart|kill|rm|pause|unpause]
- run/create [镜像名] # 创建一个新的容器并运行 / 创建一个容器,但不启动
-d: 后台运行容器,并返回容器ID;
-i: 以交互模式运行容器,通常与 -t 同时使用;
-p: 端口映射,格式为:主机(宿主)端口:容器端口
-t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
--name="Nginx-lb": 为容器指定一个名称;
--dns 8.8.8.8: 指定容器使用的DNS服务器,默认和宿主一致;
-m :设置容器使用内存最大值;
--net="bridge": 网络连接类型,支持 bridge/host/none/container: 四种类型;
--link=[]: 添加链接到另一个容器;
--expose=[]: 开放一个端口或一组端口;
- start/stop/restart [容器名] #启动/停止/重启一个容器
- kill [容器名] #直接杀掉容器,不给进程响应时间
- rm [容器名] #删除已经停止的容器
-f #强制删除,可以删除正在运行的容器
- pause/unpause [容器名] #暂停/恢复容器中的进程
docker [ps|inspect|exec|logs|export|import]
- ps #查看容器列表(默认查看正在运行的容器, -a 查看所有容器)
- inspect[容器名] #查看容器配置元数据
- exec -it [容器名] /bin/bash #进入容器环境中交互操作
- logs -since="2020-02-01" -f -tail=10 [容器名] #查看容器日志
- cp path [容器名]:path #容器与主机之间的数据拷贝
- export -o test.tar [容器名] / export [容器名]>test.tar #文件系统作为一个tar归档文件
- import test.tar [镜像名:版本号] #导入归档文件,成为一个镜像
镜像操作
docker [images|rmi|tag|build|history|save|load]
- images #列出本地镜像列表
- rmi [镜像名:版本] #删除镜像
- tag [镜像名:版本] / [镜像名:版本] [仓库] #标记本地镜像,将其归入某一仓库
- build -t [镜像名:版本] [path] #创建镜像
- history [镜像名:版本] #查看指定镜像的创建历史
- save -o xxx.tar [镜像名:版本] / save [镜像名:版本]>xxx.tar #将镜像保存成tar归档文件
- load --input xx.tar / load<xxx.jar #从归档文件加载镜像
仓库操作
docker官方仓库: https://hub.docker.com
-------- 自由注册,邮件激活
Docker [pull/search/login/push/tag]
search:在仓库中查询镜像 – 无法查询到tag版本
pull: 下载镜像到本地
tag: 标记本地镜像,将其归入某一仓库
push: 推送镜像到仓库 --需要登陆
login:登陆仓库
#查询所有jdk的镜像(本地和远程)
docker search jdk
#拉取指定的镜像
docker pull docker.io/gmaslowski/jdk
#标记jdk ,将其归入私服仓库
docker tag docker.io/gmaslowski/jdk 192.168.227.133:5000/OracleJDK8
#将OracleJDK8推送至私服仓库
docker push 192.168.227.133:5000/OracleJDK8
#登录,一般对官方仓库操作时使用、私服并不需要登录
docker login
私服仓库创建
-
修改docker配置
vim /etc/docker/daemon.json #内容如下 { "bip":"172.17.5.1/24", "registry-mirrors":["https://registry.docker-cn.com"], "insecure-registries":["192.168.227.133:5000"] } #bip 配置容器创建的ip段 #registry-mirrors 镜像默认下载地址,[加速器] #insecure-registries 开放http - 私服默认只能使用https,需要配置
-
重启docker
systemctl daemon-reload systemctl restart docker
-
下载registry镜像,并启动
docker pull registry docker run -d --name reg -p 5000:5000 registry
-
推送镜像到私服仓库
docker tag hello-world 192.168.227.133:5000/hello-world docker push 192.168.227.133:5000/hello-world
-
查看
#查询仓库镜像 curl http://192.168.227.133:5000/v2/_catalog #查询镜像版本(如 查看hello镜像版本) curl http://192.168.227.133:5000/v2/hello/tags/list
常用命令详情
-
创建
#交互式创建容器并进入(前台进程) docker run -it --name cent centos:latest /bin/bash #创建容器并后台启动容器 (-d 后台运行 -it 交互shell进程) #如果不加 it 后台启动容器后会立马关闭容器的运行. 因为容器不知道干什么的时候回立刻退出. -it 会创建一个交互shell进程 docker run -dit --name cent centos #创建容器并绑定容器端口到主机 docker run -dit -p 8080:80 --name Nginx Nginx:latest #创建容器 并绑定容器端口到主机 和 启动Nginx docker run -d -p 80:80 --name Nginx ce-Nginx /usr/sbin/Nginx -g "daemon off;" ps:后面运行的命令都是容器命令,由于Nginx命令没有设置到path中,所以全路径启动, 而Nginx -g这个参数是指可以在外面添加指令到Nginx的配置文件中, daemon off是指Nginx服务不运行在后端,而是在前台运行(container中的服务必须运行在前台) #进入已运行的容器 docker exec -it Nginx /bin/bash
-
数据管理
docker容器运行,产生一些数据/文件/等等持久化的东西,不应该放在容器内部。应当以挂载的形式存在主机文件系统中。
#volume参数创建容器数据卷 docker run --name data -v /opt/data -it centos /bin/bash #指定宿主机目录挂载文件 (注意 : 号后面必须是以 / 开头,否则容器将无法创建目录 而启动失败) docker run --name data1 -v /opt/data:/data -it centos /bin/bash #创建一个新的容器 挂载 与指定容器 相同的文件目录 docker run -it --rm --volumes-from data1 --name app centos /bin/bash
docker inspect data 查看
docker inspect data1 查看
docker inspect app 查看 (与data1容器相同 )
-
其他
#将某个容器提交成为一个镜像 docker commit cent cent-ng:v1 #退出容器 exit 退出容器(由前台进程创建进入的容器 会关闭容器,由后台进程创建进入的容器 不会关闭容器); Ctrl + P + Q 退出不关闭容器; #复制主机文件到容器内 docker cp anac.cfg cent:/var
Dockerfile的使用(文件名必须是 Dockerfile)
-
Dockerfile 指令
FROM: FROM {base镜像} 必须放在DOckerfile的第一行,表示从哪个baseimage开始构建 MAINTAINER: 可选的,用来标识image作者的地方 RUN RUN都是启动一个容器、执行命令、然后提交存储层文件变更。 第一层 RUN command1 的执行仅仅是当前进程,一个内存上的变化而已,其结果不会造成任何文件。 而到第二层的时候,启动的是一个全新的容器,跟第一层的容器更完全没关系,自然不可能继承前一层构建 过程中的内存变化。而如果需要将两条命令或者多条命令联合起来执行需要加上&&。 如:cd /usr/local/src && wget xxxxxxx CMD: CMD的作用是作为执行container时候的默认行为(容器默认的启动命令) 当运行container的时候声明了command,则不再用image中的CMD默认所定义的命令 一个Dockerfile中只能有一个有效的CMD,当定义多个CMD的时候,只有最后一个才会起作用 EXPOSE EXPOSE 指令是声明运行时容器提供服务端口,这只是一个声明,在运行时并不会因为这个声明应用就会开 启这个端口的服务。在 Dockerfile 中写入这样的声明有两个好处,一个是帮助镜像使用者理解这个镜像服 务的守护端口,以方便配置映射;另一个用处则是在运行时使用随机端口映射时,也就是 docker run -P 时,会自动随机映射 EXPOSE 的端口。 ENTRYPOINT: entrypoint的作用是,把整个container变成可执行的文件,且不能够通过替换CMD的方法来改变创建 entrypoint的方式。但是可以通过参数传递的方法影响到entrypoint内部 每个Dockerfile只能够包含一个entrypoint,多个entrypoint只有最后一个有效 当定义了entrypoint以后,CMD只能够作为参数进行传递 ADD & copY: 把host上的文件或者目录复制到image中(能够进行自动解压压缩包) ENV: 用来设置环境变量,后续的RUN可以使用它所创建的环境变量 workdir: 用来指定当前工作目录(或者称为当前目录) USER: 运行RUN指令的用户 VOLUME: 用来创建一个在image之外的mount point
-
CMD Dockerfile文件
# base image FROM centos #CMD echo "hello cmd" CMD ["/bin/bash", "-c", "echo 'hello cmd!'"]
#使用Dockerfile创建CMD镜像( 最后的一个 . 表示在当前目录找Dockerfile文件 ) docker build -t cmd . #使用CMD镜像创建一个cmd容器 docker run -it cmd
-
Nginx Dockerfile
# base image FROM docker.io/mamohr/centos-java:latest # MAINTAINER MAINTAINER Jaye # put Nginx-1.13.2.tar.gz ADD Nginx-1.13.2.tar.gz /usr/local/src # running required command RUN yum install -y gcc gcc-c++ glibc make autoconf openssl openssl-devel && yum install -y libxslt-devel -y gd gd-devel GeoIP GeoIP-devel pcre pcre-devel && useradd -M -s /sbin/nologin Nginx # change dir to /usr/local/src/Nginx-1.13.2 workdir /usr/local/src/Nginx-1.13.2 # execute command to compile Nginx RUN ./configure --user=Nginx --group=Nginx --prefix=/usr/local/Nginx --with-file-aio --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_xslt_module --with-http_image_filter_module --with-http_geoip_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_auth_request_module --with-http_random_index_module --with-http_secure_link_module --with-http_degradation_module --with-http_stub_status_module && make && make install EXPOSE 80 ENV PATH /usr/local/Nginx/sbin:$PATH CMD ["/bin/bash", "-c", "Nginx -g 'daemon off;'"]
#使用Dockerfile创建CMD镜像( 最后的一个 . 表示在当前目录找Dockerfile文件 ) docker build -t ce-Nginx . #使用CMD镜像创建一个cmd容器 docker run -d -p 80:80 --name Nginx ce-Nginx
-
工程项目 Dockerfile
# base image FROM docker.io/gmaslowski/jdk # MAINTAINER MAINTAINER Jaye #Dockerfile不支持指定文件目录挂载 VOLUME /tmp/logs/task ADD ["task.jar", "web.jar"] EXPOSE 8081 ENTRYPOINT ["java","-jar","/web.jar"]
docker build -t task . docker run -d -p 8081:8081 -v /tmp/logs/task:/tmp/logs/task --name task task
#项目配置 server.port=8081 logging.file.path=/home/task/logs/