docker run ubuntu:15.10 /bin/echo "Hello world"
docker run 镜像名(可选) 容器名 要执行的命令
运行容器
service docker status
查看docker守护进程是否在运行(docker)
docker ps
查看运行的容器
docker ps -a
显示所有容器
docker run -i -t ubuntu:15.10 /bin/bash
进入交互式docker窗口
-t:在新容器内指定一个伪终端或终端。
-i:允许你对容器内的标准输入 (STDIN) 进行交互。
ctrl+p+q 退容器,后台运行
docker run -d ubuntu:15.10 /bin/sh -c "while true; do echo hello world; sleep 1; done"
启动后台docker进程
-d 后台启动
docker logs 容器id
查看容器内的标准输出
docker stop 容器id
停止容器
docker restart 容器id
重启容器
docker pull 镜像
拉取镜像(下载)
docker run -d -P training/webapp python app.py
启动web程序
-d:让容器在后台运行。
-P:将容器内部使用的网络端口映射到我们使用的主机上。
docker run -d -P 5000:5000 training/webapp python app.py
端口映射到我们使用的主机上
-d:让容器在后台运行。
-P:将容器内部使用的网络端口映射到我们使用的主机上。
-P :是容器内部端口随机映射到主机的高端口。
-p : 是容器内部端口绑定到指定的主机端口。
docker run -d -p 5000:5000 training/webapp python app.py
我们可以指定容器绑定的网络地址,比如绑定127.0.0.1。
docker run -d -p 127.0.0.1:5001:5000 training/webapp python app.py
默认都是绑定 tcp 端口,如果要绑定 UDP 端口,可以在端口后面加上 /udp。
docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py
docker run -d -P --name runoob training/webapp python app.py
当我们创建一个容器的时候,docker会自动对它进行命名。另外,我们也可以使用--name标识来命名容器
Docker 容器镜像删除
1.停止所有的container,这样才能够删除其中的images:
docker stop $(docker ps -a -q)
如果想要删除所有container的话再加一个指令:
docker rm $(docker ps -a -q)
2.查看当前有些什么images
docker images
3.删除images,通过image的id来指定删除谁
docker rmi <image id>
想要删除untagged images,也就是那些id为<None>的image的话可以用
docker rmi $(docker images | grep "^<none>" | awk "{print $3}")
要删除全部image的话
docker rmi $(docker images -q)
【Error response from daemon: conflict:
unable to delete 4ac2d12f10cd (must be forced)
- image is referenced in multiple repositories】
【来自守护进程的错误响应:冲突:无法删除4ac2d12f10cd(必须强制) - 映像在多个存储库中被引用】
以上操作如不能删除镜像:执行如下
docker container ls -a 列出所有容器(docker ps -a -q)
删除所有容器
docker rm -f $(docker container ls -a)
删除镜像
docker rmi 镜像id
curl -s http://ip.cn
强制删除容器db01、db02
docker rm -f db01 db02
docker port 容器id
可以查看指定 (ID 或者名字)容器的某个确定端口映射到宿主机的端口号。
docker logs -f 容器id
查看容器输出日志,类似linux tail -f
docker top 容器id
来查看容器内部运行的进程
docker inspect 容器id
查看 Docker 的底层信息。它会返回一个 JSON 文件记录着 Docker 容器的配置和状态信息
docker ps -l
查询最后一次创建的容器
docker rm 容器id
删除不需要的容器
docker images
来列出本地主机上的镜像
我们可以从 Docker Hub 网站来搜索镜像,Docker Hub 网址为: https://hub.docker.com/
我们也可以使用 docker search 命令来搜索镜像。比如我们需要一个httpd的镜像来作为我们的web服务。
我们可以通过 docker search 命令搜索 httpd 来寻找适合我们的镜像。
docker search httpd
docker build
构建新的镜像
接下来我们创建一个守护态的Docker容器,然后使用docker attach命令进入该容器。
docker run -itd ubuntu:14.04 /bin/bash
进入容器的几种方法:
1、exec
通过docker ps 查看需要进入的容器pid
执行
docker exec -it 246f35c432de /bin/bash
退出容器,不会关闭容器,一般使用这个方法。
2、attach
通过docker ps 查看需要进入的容器pid
docker attach pid
退出容器会关闭容器,不推荐
3、ssh
在镜像(或容器)中安装SSH Server,这样就能保证多人进入
容器且相互之间不受干扰了,相信大家在当前的生产环境中(没有使用Docker的情况)也是这样做的。
但是使用了Docker容器之后不建议使用ssh进入到Docker容
4、nsenter
系统默认将我们需要的nsenter安装到主机中
如果没有安装的话,按下面步骤安装即可(注意是主机而非容器或镜像)
具体的安装命令如下:
wget https://www.kernel.org/pub/linux/utils/util-linux/v2.24/util-linux-2.24.tar.gz
tar -xzvf util-linux-2.24.tar.gz
cd util-linux-2.24/
./configure --without-ncurses
make nsenter
sudo cp nsenter /usr/local/bin
nsenter可以访问另一个进程的名称空间。所以为了连接到某个容器我们还需要获取该容器的第一个进程的PID。
可以使用docker inspect命令来拿到该PID。
docker ps
可以使用docker inspect来查看该容器的详细信息。
docker inspect 44fc0f0582d9
docker inspect 246f35c432de | grep Pid
如果要显示该容器第一个进行的PID可以使用如下方式
docker inspect -f {{.State.Pid}} 44fc0f0582d9
在拿到该进程PID之后我们就可以使用nsenter命令访问该容器了。
nsenter --target 3326 --mount --uts --ipc --net --pid
退出容器,不会关闭容器。
docker tag 命令,为镜像添加一个新的标签。
docker tag 镜像id 镜像名:标签名(版本号)
docker run -p 80:80 --name mynginx -v $PWD/www:/www -v $PWD/conf/nginx.conf:/etc/nginx/nginx.conf -v $PWD/logs:/wwwlogs -d nginx
-p 80:80:将容器的80端口映射到主机的80端口
--name mynginx:将容器命名为mynginx
-v $PWD/www:/www:将主机中当前目录下的www挂载到容器的/www
-v $PWD/conf/nginx.conf:/etc/nginx/nginx.conf:将主机中当前目录下的nginx.conf挂载到容器的/etc/nginx/nginx.conf
-v $PWD/logs:/wwwlogs:将主机中当前目录下的logs挂载到容器的/wwwlogs
docker创建镜像
两种方法
1、通过更新已有的镜像容器,并提交镜像,来创建镜像。
进入docker交互式窗口
docker run -i -t ubuntu /bin/bash
在容器中更新镜像
apt-get update
退出交互式窗口
exit
提交镜像
docker commit -m="has update" -a="runoob" e218edb10161 ubuntu:v2
-m:提交的描述信息
-a:指定镜像作者
e218edb10161:容器ID
ubuntu:v2 指定要创建的目标镜像名和标签(版本)
2、使用dockerfile来创建新的镜像
1、创建一个dockerfile文件
touch dockerfile
2、添加指令
FROM centos:6.7
MAINTAINER Fisher "fisher@sudops.com"
RUN /bin/echo 'root:123456' |chpasswd
RUN useradd runoob
RUN /bin/echo 'runoob:123456' |chpasswd
RUN /bin/echo -e "LANG=\"en_US.UTF-8\"" >/etc/default/local
EXPOSE 22
EXPOSE 80
CMD /usr/sbin/sshd -D
每一个指令都会在镜像上创建一个新的层,每一个指令的前缀都必须是大写的。
第一条FROM,指定使用哪个镜像源
RUN 指令告诉docker 在镜像内执行命令,安装了什么。。。
然后,我们使用 Dockerfile 文件,通过 docker build 命令来构建一个镜像。
docker build -t runoob/centos:6.7 .
-t :指定要创建的目标镜像名
.(上下文) :Dockerfile 文件所在目录,可以指定Dockerfile 的绝对路径