Docker是一个开源的引擎,可以轻松的为任何应用创建一个轻量级的、可移植的、自给自足的容器。开发者在笔记本上编译测试通过的容器可以批量地在生产环境中部署,包括VMs(虚拟机)、 bare metal、OpenStack 集群和其他的基础应用平台。
Docker通常用于如下场景:
Docker架构图:
Docker系统有两个程序:docker服务端和docker客户端。其中docker服务端是一个服务进程,管理着所有的容器。docker客户端则扮演着docker服务端的远程控制器,可以用来控制docker的服务端进程。大部分情况下,docker服务端和客户端运行在一台机器上。
配置yum源
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
查看yum仓库中,docker版本
yum list docker-ce --showduplicates |sort -r
默认安装最新版本
yum makecache fast
yum -y install docker-ce
启动docker并配置docker镜像源,然后重启生效
点击:阿里云容器国内镜像加速地址
进去后复制加速地址
systemctl start docker
cd /etc/docker
vim daemon.json //如果有该文件,则修改,没有则创建
{
“registry-mirrors”:[“https://m9r2r2uj.mirror.aliyuncs.com”]
}
查看docker版本
[root@docker_test ~]# docker version
Client:
Version: 18.09.7
API version: 1.39
Go version: go1.10.8
Git commit: 2d0083d
Built: Thu Jun 27 17:56:06 2019
OS/Arch: linux/amd64
Experimental: false
Server: Docker Engine - Community
Engine:
Version: 18.09.7
API version: 1.39 (minimum version 1.12)
Go version: go1.10.8
Git commit: 2d0083d
Built: Thu Jun 27 17:26:28 2019
OS/Arch: linux/amd64
Experimental: false
将image文件从仓库抓到本地
docker pull library/hello-world
查看image
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest fce289e99eb9 6 months ago 1.84kB
运行这个image文件
docker run hello-world
查看仓库中的nginx
[root@docker_test ~]# docker search nginx
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
nginx Official build of Nginx. 11704 [OK]
jwilder/nginx-proxy Automated Nginx reverse proxy for docker con… 1628 [OK]
richarvey/nginx-php-fpm Container running Nginx + PHP-FPM capable of… 726 [OK]
bitnami/nginx Bitnami nginx Docker Image 69 [OK]
linuxserver/nginx An Nginx container, brought to you by LinuxS… 69
........ ........
列出镜像,没有nginx镜像
[root@docker_test ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest fce289e99eb9 6 months ago 1.84kB
执行docke 运行命令,自动查看是否有该镜像,如果有则直接运行,没有就安装后再运行
[root@docker_test ~]# docker run -p 91:80 nginx
Unable to find image 'nginx:latest' locally
latest: Pulling from library/nginx
fc7181108d40: Pull complete
d2e987ca2267: Pull complete
0b760b431b11: Pull complete
Digest: sha256:48cbeee0cb0a3b5e885e36222f969e0a2f41819a68e07aeb6631ca7cb356fed1
Status: Downloaded newer image for nginx:latest
-p 91:80
//docker是依赖于LXC的高级容器引擎,91端口是宿主机映射到docker容器中nginx的80端口。
//client可以通过docker命令来操控宿主机去管理docker容器,但是不能直接操作docker容器
//我们需要将宿主机的端口映射到容器中,通过访问宿主机来访问docker容器。
上条命令为了演示效果,没有放到后台运行,我们新开一个终端,列出当前正在运行的容器
[root@docker_test ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f4754abb3825 nginx "nginx -g 'daemon of…" 7 minutes ago Up 7 minutes 0.0.0.0:91->80/tcp adoring_hofstadter
终止,并放入后台运行
[root@docker_test ~]# docker run -d -p 91:80 nginx
92418675f5b965996aca93cd1114ead6bad26034ac9e6fbf55cff168857bdb00
在浏览器通过访问宿主机的ip+91端口,即可访问到docker容器内的nginx
安装java8镜像:
docker pull java:8
列出宿主机上的镜像:
docker images
停止容器
docker stop 容器ID(可通过docker ps -n 数字 查看历史运行过的容器)
强制停止容器
docker kill 容器ID
启动已经停止的容器
docker start 容器ID
查看容器所有信息
docker inspect 容器ID
查看容器日志
docker container logs 容器ID
查看容器里的进程
docker top 容器ID
进入容器可做相关配置,权限极低,不建议使用
docker container exec -it 容器ID /bin/bash
[root@docker_test ~]# docker exec -it 92418675f5b9 /bin/bash
root@92418675f5b9:/# ls
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
当想启动相同名称的容器时,会报错:
docker: Error response from daemon: Conflict. The container name "/mycentos" is already in use by container "c44e71c3799547e22f1bac2ebc444b66b26721f291b9b6ffc0b91ee3f2d66533". You have to remove (or rename) that container to be able to reuse that name.
See 'docker run --help'.
意思就是说,这个名字已经运行了一个容器了,如果想用相同名称再运行一个容器,必须将之前的容器给删掉。
通过 docker ps查看,发现没有正在运行的容器。
原来是通过 docker ps -l 找到之前的容器ID,再使用dokcer rm 容器ID删除即可。
在容器内部安装软件(命令),例如安装vim
//先要进入容器
[root@docker_test ~]# docker exec -it 92418675f5b9 /bin/bash
//在容器内部安装vim
root@92418675f5b9:/# apt-get install vim
此时会报错:
Reading package lists... Done
Building dependency tree
Reading state information... Done
E: Unable to locate package vim
//我们应该先执行apt-get update,待更新完成后再执行apt-get install vim。
root@92418675f5b9:/# apt-get update
......过程省略......
root@92418675f5b9:/# apt-get install vim
//注意:apt-get为固定格式,没有yum命令
刚刚我们在docker中部署了一个官方的nginx容器,我们现在通过Dockerfile来自定义一个nginx容器。
先来简单介绍一下Dockerfile,Dockerfile是一个文本文件,其中包含了若干条指令,指令描述了构建镜像的细节。
新建一个nginx_app目录,在当前目录下生成一个Dockerfile文件,添加以下内容
[root@docker_test nginx_app]# pwd
/root/nginx_app
[root@docker_test nginx_app]# vim Dockerfile
FROM nginx
RUN echo 'It‘s in RunTu'
s house!!!!</h1>' > /usr/share/nginx/html/index.html
//FROM、RUN都是Docker的指令。FROM指令用于指定基础镜像,RUN指令执行命令
//lnginx容器的默认首页位置:/usr/share/nginx/html/index.htm
可以进入该容器中验证。
[root@docker_test ~]# docker container exec -it 92418675f5b9 /bin/bash
root@92418675f5b9:/# ls /usr/share/nginx/html/
50x.html index.html
利用Docker模板文件来构建nginx镜像
[root@docker_test ~]# docker build -t nginx:lizhao /root/nginx_app
Sending build context to Docker daemon 2.048kB
Step 1/2 : FROM nginx
---> f68d6e55e065
Step 2/2 : RUN echo "It is in RunTu's house!!!!
" > /usr/share/nginx/html/index.html
---> Running in 7ec0ac0bcee2
Removing intermediate container 7ec0ac0bcee2
---> aa639d1e0e34
Successfully built aa639d1e0e34
Successfully tagged nginx:lizhao
//-t指定镜像名字,/root/nginx_app为Dockerfile文件所在路径
执行启动命令,即可使用该镜像启动一个Docker容器
[root@docker_test ~]# docker run -d -p 92:80 nginx:lizhao
8e5081841d15afb60e15b8b02331bad529e9946bbe49781a43dd2ba83ac8e1b4
列出正在运行中的容器,发现有两个nginx容器,一个是之前开启的官方nginx,还有一个是我们自己构建的nginx容器
[root@docker_test ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8e5081841d15 nginx:lizhao "nginx -g 'daemon of…" 49 seconds ago Up 48 seconds 0.0.0.0:92->80/tcp friendly_lovelace
92418675f5b9 nginx "nginx -g 'daemon of…" About an hour ago Up About an hour 0.0.0.0:91->80/tcp awesome_newton
同样的道理,我们在浏览器输入宿主机的ip+92端口,就可以访问到我们自己构建的nginx容器的80端口
容器卷:实现容器上的数据持久化和容器数据共享。
可理解为将宿主机上路径挂载到容器内的某一路径。
docker run -it -v /宿主机的绝对路径:/容器内部的路径 镜像名
当然我们也可以利用Dockerfile文件自定义构建容器卷镜像。
//查看Dockerfile文件内容。并启构建
[root@localhost ~]# cat Dockerfile
FROM centos
VOLUME ["/datavomule_test01","/datavolume_test02"]
CMD echo "finished------------sucessful"
CMD /bin/bash
[root@localhost ~]# docker build -t lz/centos -f /root/Dockerfile .
构建过程省略。。。。
//启动该容器卷
[root@localhost ~]# docker run -it --name lzcentos lz/centos
[root@22c90695e855 /]# ls
anaconda-post.log datavolume_test02 dev home lib64 mnt proc run srv tmp var
bin datavomule_test01 etc lib media opt root sbin sys usr
//可查看到lz/centos容器内已经自动创建了两个挂载目录。
//查看容器的详细信息
[root@localhost ~]# docker inspect 22c90695e855|grep Source
"Source": "/var/lib/docker/volumes/cf91aa2ecaea6393478c1188f1334145b1b7aa149d282fca3347d88cf051b229/_data",
"Source": "/var/lib/docker/volumes/737b42dd7c566cd21991b3c083525a02619ae403480b57ba14b0c1678a136966/_data",
//在我们没有指定宿主机的路径时,dokcer会默认生成一个挂载路径。可以通过查看容器的详细信息找到该路径。