docker教程之从一头雾水到不一头雾水(3)
本文主要是介绍Docker容器的相关内容
容器创建
我们已经知道,镜像是只读的,而基于镜像创建出来的容器是可读写的,所以,一般我们实际中,会经常使用对应镜像创建容器并且使用这些容器。同样,如果我们想要使用容器,那么我们必须首先需要创建容器。而且要知道一个镜像可以同时创建多个容器
[root@206 /]# docker run -t -i ubuntu:17.10 /bin/bash
容器的启动
容器的启动主要分为两种方式:
exit之后就是终止状态
[root@206 /]# docker run -t -i ubuntu:17.10 /bin/bash
root@abc6e11de34e:/# exit
exit
查看docker上所有的容器

[root@206 /]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
abc6e11de34e ubuntu:17.10 "/bin/bash" 11 minutes ago Exited (0) 50 seconds ago ecstatic_meitner
bcd455f0bc0f cbf64eb48a64 "/bin/sh -c 'mkdir..." 3 hours ago Exited (1) 3 hours ago xenodochial_minsky
2f90664d6391 cbf64eb48a64 "/bin/sh -c 'mkdir..." 3 hours ago Exited (1) 3 hours ago amazing_kowalevski

再次启动
[root@206 /]# docker start abc6

[root@206 /]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
abc6e11de34e ubuntu:17.10 "/bin/bash" 14 minutes ago Up 2 seconds ecstatic_meitner
bcd455f0bc0f cbf64eb48a64 "/bin/sh -c 'mkdir..." 3 hours ago Exited (1) 3 hours ago xenodochial_minsky
2f90664d6391 cbf64eb48a64 "/bin/sh -c 'mkdir..." 3 hours ago Exited (1) 3 hours ago amazing_kowalevski

守护态运行
Docker里的容器可以在后台以守护态的方式运行,这样可以方便我们对Docker的操作
[root@206 /]# docker run -d ubuntu:17.10 /bin/bash -c "while true;do echo thanks;sleep 3;done"

[root@206 /]# docker logs 9e48
thanks
thanks
thanks
thanks
thanks
thanks
thanks
thanks
...

终止
假如我们暂时不想运行某个容器,我们可以终止该容器,终止之后,对应的容器将退出运行状态

[root@206 /]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9e489b563341 ubuntu:17.10 "/bin/bash -c 'whi..." 2 minutes ago Up 2 minutes inspiring_hawking
abc6e11de34e ubuntu:17.10 "/bin/bash" 25 minutes ago Up 11 minutes ecstatic_meitner
bcd455f0bc0f cbf64eb48a64 "/bin/sh -c 'mkdir..." 3 hours ago Exited (1) 3 hours ago xenodochial_minsky
2f90664d6391 cbf64eb48a64 "/bin/sh -c 'mkdir..." 3 hours ago Exited (1) 3 hours ago amazing_kowalevski

这里有两个正在后面默默运行的容器

[root@206 /]# docker stop 9e48
9e48
[root@206 /]# docker stop abc6
abc6
[root@206 /]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9e489b563341 ubuntu:17.10 "/bin/bash -c 'whi..." 4 minutes ago Exited (137) 13 seconds ago inspiring_hawking
abc6e11de34e ubuntu:17.10 "/bin/bash" 28 minutes ago Exited (0) 8 seconds ago ecstatic_meitner
bcd455f0bc0f cbf64eb48a64 "/bin/sh -c 'mkdir..." 3 hours ago Exited (1) 3 hours ago xenodochial_minsky
2f90664d6391 cbf64eb48a64 "/bin/sh -c 'mkdir..." 4 hours ago Exited (1) 4 hours ago amazing_kowalevski

依附容器
我们可以使用Docker attach指令依附到某个容器中,通俗来说,就是指我们可以通过该指令进入某个容器。
没有在运行的容器是不能依附的

[root@206 /]# docker start abc6
abc6
[root@206 /]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9e489b563341 ubuntu:17.10 "/bin/bash -c 'whi..." 10 minutes ago Exited (137) 6 minutes ago inspiring_hawking
abc6e11de34e ubuntu:17.10 "/bin/bash" 34 minutes ago Up 2 seconds ecstatic_meitner
bcd455f0bc0f cbf64eb48a64 "/bin/sh -c 'mkdir..." 4 hours ago Exited (1) 4 hours ago xenodochial_minsky
2f90664d6391 cbf64eb48a64 "/bin/sh -c 'mkdir..." 4 hours ago Exited (1) 4 hours ago amazing_kowalevski

[root@206 /]# docker attach abc6
root@abc6e11de34e:/#
其实依附也就是进入一个容器而已
容器信息查看
查看运行中的容器
[root@206 /]# docker ps
查看所有容器
[root@206 /]# docker ps -a
查看最后一次创建的容器
[root@206 /]# docker ps -l
查看运行中的容器的id号
[root@206 /]# docker ps -q
上面的查看守护容器的log
[root@206 /]# docker logs 9e48
实时查看
[root@206 /]# docker logs -f 9e48
只查看最新两行
[root@206 /]# docker logs --tail=2 9e48
只查看最新的两行,且不断实时查看
[root@206 /]# docker logs --tail=2 -f 9e48
附加产生log的具体时间
[root@206 /]# docker logs -t 9e48
容器内命令执行
2.1 后台执行
[root@206 /]# docker exec -d abc6 touch /q.txt
[root@206 /]# docker exec -d abc6 echo "123"
[root@206 /]#
2.2 交互执行
[root@206 /]# docker exec -ti abc6 touch /w.txt
[root@206 /]# docker exec -ti abc6 echo "123"
123
容器的导入导出
我们已经学过如何将某个镜像导出成一个压缩文件,移植到其他环境中使用。同样,我们也可以将某个容器通过docker export指令导出为一个压缩文件,然后存储起来,在必要的时候可以根据该压缩文件恢复为容器
[root@206 /]# docker export abc6 > abc6.tar
[root@206 /]# cat abc6.tar | docker import - cba:v2
查看镜像,发现多了一个

[root@206 /]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
cba v2 7ee75c306951 48 minutes ago 78.5 MB
<none> <none> cbf64eb48a64 6 hours ago 89.6 MB
newsuse 99999 7e4ff5f67461 6 hours ago 156 MB
newubuntu 8888 036d21b62a12 6 hours ago 89.6 MB
ubuntu 17.10 073e7b409b9b 43 hours ago 89.6 MB
itliucheng/ubuntu first 073e7b409b9b 43 hours ago 89.6 MB

创建容器
[root@206 /]# docker run -ti cba:v2 /bin/bash
虽然容器号不一样了,但是内容是完全一样的
数据卷
[root@206 ~]# docker run -ti -v /abctest ubuntu:17.10 /bin/bash
-v就是创建数据卷参数,并且挂载到指定的容器里
root@f109cdc59516:/# ls
abctest bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
挂载
我们在容器中创建了数据卷之后,可以把母机器中的某个目录或某个文件挂载到数据卷中,这样,这个目录或文件与容器中的数据卷内容就相当于是一个了。
[root@206 ~]# cd /
[root@206 /]# mkdir gztest
[root@206 /]# cd gztest/
[root@206 gztest]# touch a.txt
创建容器并挂载 将母机的gztest挂载到 容器中的contest中

[root@206 gztest]# docker run -ti -v /gztest:/contest ubuntu:17.10 /bin/bash
root@9647eb0d2898:/# ls
bin boot contest dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
root@9647eb0d2898:/# cd contest/
root@9647eb0d2898:/contest# ls
a.txt

延伸:如果创建的容器有权限限制,就修改成这样创建容器docker run -ti -v /gztest:/contest --privileged=true ubuntu:17.10 /bin/bash 再或者关闭selinux 命令为: setenforce 0
docker run -ti -v /file.txt:/co/b.txt ubuntu:17.10 /bin/bash
数据卷容器
[root@206 /]# docker run -ti -v /abc --name datac1 ubuntu:17.10 /bin/bash

[root@206 /]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b2e8f642c525 ubuntu:17.10 "/bin/bash" 17 seconds ago Exited (0) 8 seconds ago datac1
9647eb0d2898 ubuntu:17.10 "/bin/bash" 27 minutes ago Exited (0) 14 minutes ago focused_jang
f109cdc59516 ubuntu:17.10 "/bin/bash" 34 minutes ago Exited (0) 32 minutes ago stupefied_curie
6d8a8372d68b cba:v2 "/bin/bash" 3 hours ago Up 3 hours unruffled_agnesi
9e489b563341 ubuntu:17.10 "/bin/bash -c 'whi..." 6 hours ago Exited (137) 5 hours ago inspiring_hawking
abc6e11de34e ubuntu:17.10 "/bin/bash" 6 hours ago Up 5 hours ecstatic_meitner
bcd455f0bc0f cbf64eb48a64 "/bin/sh -c 'mkdir..." 9 hours ago Exited (1) 9 hours ago xenodochial_minsky
2f90664d6391 cbf64eb48a64 "/bin/sh -c 'mkdir..." 9 hours ago Exited (1) 9 hours ago amazing_kowalevski

创建另外一个普通容器,并挂载数据卷容器
[root@206 /]# docker run -ti --volumes-from b2e8 --name testcommon ubuntu:17.10 /bin/bash
root@f99f555cfac5:/# ls
abc bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
数据迁移

[root@206 /]# docker run -ti -v /abcd --name abc ubuntu:17.10 /bin/bash
root@42fae694e443:/# ls
abcd bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
root@42fae694e443:/# cd abcd/
root@42fae694e443:/abcd# touch a.txt&&touch b.txt
root@42fae694e443:/abcd# ls
a.txt b.txt

创建普通容器
[root@206 /]# docker run -ti --volumes-from 42fa -v /gztest:/backup --name backcontainer ubuntu:17.10 tar cvf /backup/task1.tar /abcd
母机上
[root@206 /]# cd gztest/
[root@206 gztest]# ls
a.txt task1.tar
数据恢复就不说了,在建立一个容器,将母机文件所在目录挂载到容器的目录中
容器命名
从之前到现在,创建了很多的容器

[root@206 /]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c977c2f4e1a9 ubuntu:17.10 "/bin/bash" 24 minutes ago Up 24 minutes 0.0.0.0:32769->8998/tcp net2
e617f1cd394d ubuntu:17.10 "/bin/bash" 25 minutes ago Exited (0) 25 minutes ago net1
dbb53a5ddc3e ubuntu:17.10 "tar cvf /backup/t..." 50 minutes ago Exited (0) 50 minutes ago backcontainer
42fae694e443 ubuntu:17.10 "/bin/bash" 57 minutes ago Exited (0) 56 minutes ago abc
f99f555cfac5 ubuntu:17.10 "/bin/bash" 13 hours ago Exited (0) 13 hours ago testcommon
b2e8f642c525 ubuntu:17.10 "/bin/bash" 13 hours ago Exited (0) 13 hours ago datac1
9647eb0d2898 ubuntu:17.10 "/bin/bash" 14 hours ago Exited (0) 13 hours ago focused_jang
f109cdc59516 ubuntu:17.10 "/bin/bash" 14 hours ago Exited (0) 14 hours ago stupefied_curie
6d8a8372d68b cba:v2 "/bin/bash" 17 hours ago Exited (255) 2 hours ago unruffled_agnesi
9e489b563341 ubuntu:17.10 "/bin/bash -c 'whi..." 19 hours ago Exited (137) 19 hours ago inspiring_hawking
abc6e11de34e ubuntu:17.10 "/bin/bash" 20 hours ago Exited (255) 2 hours ago ecstatic_meitner
bcd455f0bc0f cbf64eb48a64 "/bin/sh -c 'mkdir..." 23 hours ago Exited (1) 23 hours ago xenodochial_minsky
2f90664d6391 cbf64eb48a64 "/bin/sh -c 'mkdir..." 23 hours ago Exited (1) 23 hours ago amazing_kowalevski

我们先根据容器id查一下容器名称
[root@206 /]# docker inspect -f "{{.Name}}" 2f90
/amazing_kowalevski
docker不允许容器同名。若出现同名
1、先删除原容器,再创建新容器。
[root@206 /]# docker rm amazing_kowalevski
把容器名换成id一样
2、使用--rm标记,一旦容器退出,自动删除容器
[root@206 /]# docker run -ti --name advc --rm ubuntu:17.10
exit之后容器已经删除了
网络服务
1、外部访问
[root@206 /]# docker run -t -P --expose 8998 --name net2 ubuntu:17.10
-P表示可以外部访问
--expose绑定端口
[root@206 /]# docker ps -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c977c2f4e1a9 ubuntu:17.10 "/bin/bash" 12 seconds ago Up 11 seconds 0.0.0.0:32769->8998/tcp net2
所以我们可以浏览器192.168.126.206:32769来访问该服务,由于容器里并没有什么web项目,所以访问也没效果
[root@206 /]# docker port net2 8998
0.0.0.0:32769
还可以这样 小写的p
[root@206 /]# docker run -t -p 192.168.126.205:8999:5001 --name net3 ubuntu:17.10
他表示访问192.168.126.206:8999来访问容器的5001端口
2、容器互联
容器互联的方式会在接收容器与源容器间创建一个隧道,接收容器可以看到源容器的指定信息
创建源容器
[root@206 /]# docker run -ti --name hl1 ubuntu:17.10
[root@206 /]# docker start hl1
创建接收容器
[root@206 /]# docker run -ti --name hl2 --link hl1:yuan1 ubuntu:17.10
我们可以进入连接容器,也就是接收容器,然后找到/etc/hosts文件,并cat查看,即可以把该容器的连接信息公开出来,包括该连接容器对应的源容器信息等。公开之后,我们可以使用ping命令测试连接是否通畅。

root@7a9dee156249:/# cat /etc/hosts
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.3 yuan1 30bd2045b737 hl1
172.17.0.4 7a9dee156249

执行 ping 172.17.0.3 或者 ping hl1 即可
2、环境变量法

[root@206 /]# docker run -ti --name hl3 --link hl1:yuan2 ubuntu:17.10 env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=7a91ce8a9480
TERM=xterm
YUAN2_NAME=/hl3/yuan2
HOME=/root

Dockerfile的使用
这是以前学的只用Dockerfile创建镜像
[root@206 test]# touch Dockerfile
FROM newubuntu:8888
MAINTAINER root
RUN touch a.txt
RUN mkdir test1
CMD:执行docker run时执行某行指令,具有替换性

FROM ubuntu:17.10
MAINTAINER root
CMD ["echo"]
[root@206 test]# docker build -t="copyubuntu" /test
[root@206 /]# docker run -ti copyubuntu echo hello
hello

ENTRYPOINT:执行docker run时执行某行指令,不具有替换性
[root@206 test]# vi Dockerfile
FROM ubuntu:17.10
MAINTAINER root
ENTRYPOINT ["echo"]
[root@206 /]# docker build -t="copyubuntu1" /test
[root@206 /]# docker run -ti copyubuntu1 echo hello
echo hello
docker教程之从一头雾水到不一头雾水(3)的更多相关文章
- docker教程之从一头雾水到不一头雾水(2)
书接上文:docker教程之从一头雾水到不一头雾水(1) 运行镜像 先查看下本地有哪些镜像 [root@ichz ~]# docker images REPOSITORY TAG IMAGE ID C ...
- Docker教程:docker machine的配置和命令
http://blog.csdn.net/pipisorry/article/details/50921335 安装virtualbox 如果要使用virtualbox,首先要安装virtualbox ...
- Docker教程:dokcer machine的概念和安装
http://blog.csdn.net/pipisorry/article/details/50920982 Docker machine介绍 做为Docker容器集群管理三剑客之一的Docker ...
- Docker教程:使用docker配置python开发环境
http://blog.csdn.net/pipisorry/article/details/50808034 Docker的安装和配置 [Docker教程:docker的安装] [Docker教程: ...
- Docker教程:docker的概念及安装
http://blog.csdn.net/pipisorry/article/details/50754385 Why docker 对于运维来说,Docker提供了一种可移植的标准化部署过程,使得规 ...
- 简明Docker教程
Docker基础 这篇基础文章是方便用户在使用cSphere平台之前,了解docker基础知识. 针对已经有一定的Linux基础知识的用户. Docker是什么 Docker是一个改进的容器技术.具体 ...
- Docker 教程
转自:http://www.runoob.com/docker/docker-tutorial.html Docker 教程
- Linux--CentOS 安装 Docker 教程
本文主要介绍 CentOS 系统安装 Docker 的流程. 前提条件 OS 要求 CentOS7: The centos-extras repository must be enabled. Thi ...
- 小D课堂 - 新版本微服务springcloud+Docker教程_汇总
小D课堂 - 新版本微服务springcloud+Docker教程_1_01课程简介 小D课堂 - 新版本微服务springcloud+Docker教程_1_02技术选型 小D课堂 - 新版本微服务s ...
随机推荐
- Codeforces Beta Round #91 (Div. 2 Only) A. Lucky Division【暴力/判断是不是幸运数字4,7的倍数】
A. Lucky Division time limit per test 2 seconds memory limit per test 256 megabytes input standard i ...
- ECNU 3462 最小 OR 路径 (贪心 + 并查集)
题目链接 EOJ Monthly 2018.1 Problem F 先假设答案的每一位都是$1$,然后从高位开始,选出那些该位置上为$0$的所有边,并查集判断连通性. 如果$s$和$t$可以连通的话 ...
- 洛谷——P2656 采蘑菇
P2656 采蘑菇 题目描述 小胖和ZYR要去ESQMS森林采蘑菇. ESQMS森林间有N个小树丛,M条小径,每条小径都是单向的,连接两个小树丛,上面都有一定数量的蘑菇.小胖和ZYR经过某条小径一次, ...
- log4j - 1
具体内容: 1. 如何在项目中配置log4j使得该系统可以输出web test的日志文件(自定义格式)到工程dist目录下的junitLog/WebTestLog.log目录下,输出508 ...
- Redis数据类型、两种模型、事务、内部命令
1.redis数据类型 a.字符串,使用场景:常规key-value缓存应用 set name lixiang get name append name 123 # 字符串追加 mset key va ...
- [POI2014]Solar Panels
题目大意: $T(T\le1000)$组询问,每次给出$A,B,C,D(A,B,C,D\le10^9)$,求满足$A\le x\le B,C\le y\le D$的最大的$\gcd(x,y)$. 思路 ...
- springboot 2.0+ 自定义拦截器
之前项目的springboot自定义拦截器使用的是继承WebMvcConfigurerAdapter重写常用方法的方式来实现的. 以下WebMvcConfigurerAdapter 比较常用的重写接口 ...
- Visio中如何让重叠图形都显示
如图,两个矩形重叠部分的边框都显示了,是拆分操作,不是组合.
- C语言中<CR>是什么意思
在文本处理中, CR, LF, CR/LF是不同操作系统上使用的换行符.Dos和windows采用回车+换行CR/LF表示下一行, 而UNIX/Linux采用换行符LF表示下一行,苹果机(MAC OS ...
- mtd-utils 工具的使用
mtd_debug [root@xmos /root]# mtd_debugusage: mtd_debug info <device> mtd_debug read < ...