docker常用操作和命令

***************************制作镜像常用命令:***************************

1、运行镜像    docker run -idt 镜像名:tag号  或  docker run -it  镜像名:tag号  /bin/bash
-i: 交互式操作
-d :指定容器的运行模式,让容器在后台运行。默认不会进入容器,想要进入容器需要使用docker exec
-t: 终端
/bin/bash:命令,这里我们希望有个交互式 Shell,因此用的是 /bin/bash

** 加端口映射: docker run -p 16800:5000 -idt 镜像名:tag号   
(容器中的5000端口映射成宿主机的16800端口)
端口映射后,外部访问容器中服务地址:宿主机IP:16800

** 将宿主机文件挂载到容器中:
docker run -it -v /test:/soft 镜像名:tag号 /bin/bash
-v参数中,冒号":"前面的目录是宿主机目录,后面的目录是容器内目录

** 设置容器编码格式
docker run -it -e PYTHONIOENCODING=UTF-8  -v /test:/soft 镜像名:tag号 /bin/bash
-e参数设置shell的默认编码方式为 utf-8,在编译python代码的时候才不会报如下错误:
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-12

** 以特权模式运行容器:
 docker run -d --name pb --privileged=true 镜像名:id /usr/sbin/init
 进入容器:
 docker exec -it pb /bin/bash
 以特权模式运行容器后,可以在容器内使用service等后台服务。

2、进入和退出容器
**进入容器**    
docker exec -it 容器名或ID  /bin/bash
docker attach --sig-proxy=false 容器名或ID   //--sig-proxy=false可确保CTRL-D或CTRL-C不会关闭且stop容器

**退出容器:**
exit :容器停止退出,容器里的程序会中断,docker ps会查不到退出的容器
Ctrl+P+Q :容器不停止退出,容器里的程序还在跑,docker ps能查到退出的容器
注意: 用docker attach进容器时,若用exit会导致容器stop掉,必须用 Ctrl+P+Q 

3、宿主机文件拷贝到容器     docker cp 宿主机项目文件存放目录  容器启动名或ID:容器中存放项目文件的目录
可直接在运行镜像时通过-v参数将宿主机文件挂载到容器。

容器文件拷贝到宿主机: docker cp 容器启动名或ID:容器中存放项目文件的目录 宿主机项目文件存放目录

4、将容器保存为新镜像   docker commit 容器启动名或ID 新镜像名:版本号

5、将新镜像打包成tar包(默认保存到当前路径)   docker save -o ***.tar   镜像名:TAG

6、加载tar包   docker load -i xxx.tar

*************************其他常用命令:*************************
1、查看容器的资源使用情况 docker top container_id
docker inspect

2、删除镜像    docker rmi   IMAGE ID
(如果镜像正在被某个容器使用,则会报错,这时只需先删除容器就好了)

3、删除容器   docker rm 容器启动名或ID

4、启动容器   docker start 容器启动名或ID
   停止容器   docker stop 容器启动名或ID

5、更名   docker tag  dl-4a:1.7.1  dl-4a:1.5.7

6、查看容器中进程信息:
在宿主机直接运行:docker exec 容器启动名或ID ps -ef
或者在容器中运行:jobs -l
停掉容器中进程:进入该容器,kill pid 

7、查看容器中端口映射信息:docker container port 容器启动名或ID
结果:15500/tcp -> 0.0.0.0:15400,容器内port 15500映射成了宿主机port 15400

参考:docker学习基本命令(一)

nvidia-docker

nvidia-docker介绍和使用:安装使用NVIDIA-Docker-- 可使用GPU的Docker容器

***起容器***
nvidia-docker run --name limin_ai -m 32G --memory-swap=-1  -it -v /sata01/AIhome_ext/limin_ai/:/code/ -v /sata01/AIhome_ext/liuxk/PSEnet/data2/:/code/invoice_project/PSEnet2/data/ tf_gpu:1.4 env LANG=C.UTF-8 /bin/bash
-v 可多次使用,挂载多个目录
-m :设置容器使用内存最大值;

核心概念理解

Docker的三大核心概念:镜像、容器、仓库

镜像:类似虚拟机的镜像、用俗话说就是安装文件。

容器:类似一个轻量级的沙箱,容器是从镜像创建应用运行实例,

可以将其启动、开始、停止、删除、而这些容器都是相互隔离、互不可见的。

仓库:类似代码仓库,是Docker集中存放镜像文件的场所。

Docker、Dockerfile、Docker镜像、容器这些都是什么鸟?

**Docker:**最早是dotCloud公司出品的一套容器管理工具,但后来Docker慢慢火起来了,连公司名字都从dotCloud改成Docker。

Dockerfile: 用于构建镜像,包含Docker镜像的描述文件,可以理解成火箭发射的A、B、C、D……的步骤。构建镜像时,每做完一个步骤,在Dockerfile中记录一条,这样Dockerfile也就做出来了。

Docker镜像: 通过Dockerfile做出来的,包含操作系统基础文件和软件运行环境,它使用分层的存储方式。
容器: 是运行起来的镜像,简单理解,Docker镜像相当于程序,容器相当于进程。
讲了这么多,大家可能已经意识到了,想玩转Docker必须先要搞定Docker镜像,镜像又来自于 Dockerfile。

docker安装–以centos7为例

前提条件
Docker 要求 Ubuntu 系统的内核版本高于 3.10 ,查看本页面的前提条件来验证你的 Ubuntu 版本是否支持 Docker。可通过 uname -r 命令查看你当前的内核版本

$ uname -r

更新yum包:

$ sudo yum update

卸载旧版本(如果安装过旧版本的话)

$ sudo yum remove docker  docker-common docker-selinux docker-engine

安装命令:

$ sudo yum install docker-ce-18.03.1.ce

启动并加入开机启动

$ sudo systemctl start docker
$ sudo systemctl enable docker

验证是否安装成功:docker info或docker version

[limin@aubin ~]$ docker info
Containers: 0
 Running: 0
 Paused: 0
 Stopped: 0
Images: 1
Server Version: 18.03.1-ce
Storage Driver: overlay2
 Backing Filesystem: xfs
 Supports d_type: true
 Native Overlay Diff: true
Logging Driver: json-file
Cgroup Driver: cgroupfs

用docker version命令,出现Client和Server信息,即表示安装成功。

[limin@aubin ~]$ docker version
Client:
 Version:      18.03.1-ce
 API version:  1.37
 Go version:   go1.9.5
 Git commit:   9ee9f40
 Built:        Thu Apr 26 07:20:16 2018
 OS/Arch:      linux/amd64
 Experimental: false
 Orchestrator: swarm

Server:
 Engine:
  Version:      18.03.1-ce
  API version:  1.37 (minimum version 1.12)
  Go version:   go1.9.5
  Git commit:   9ee9f40
  Built:        Thu Apr 26 07:23:58 2018
  OS/Arch:      linux/amd64
  Experimental: false

常见问题:
用docker info或docker version查看docker是否安装成功时,报如下错误:

Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get http://%2Fvar%2Frun%2Fdocker.sock/v1.37/version: dial unix /var/run/docker.sock: connect: permission denied

在执行命令前加上sudo即可。

若不想每次执行docker命令都加sudo ,可用如下方式:

    sudo groupadd docker     #添加docker用户组
    sudo gpasswd -a $USER docker     #将登陆用户加入到docker用户组中
    newgrp docker     #更新用户组
    docker ps    #测试docker命令是否可以使用sudo正常使用

二 常用命令

停掉docker服务:

service docker stop

查看镜像

docker images 

查看所有的容器

docker ps -a 

进入容器

docker attach 容器ID

docker exec -it 容器ID /bin/bash     

退出容器

exit

镜像操作命令–以MySQL为例

1、拉取镜像:

docker pull mysql
docker pull python:3.6.5

2、查看下载的镜像

docker images

3、根据镜像创建容器

docker run --name mysqlserver -p 3308:3306 -e 

参数解释:
–name 容器名字

-p 3308:3306 物理机端口:容器内部端口.匹配镜像内的网络端口号,即我们可以通过宿主机中访问3308端口来达到访问容器3306端口的目的。

-e 运行参数 初始化 root 用户的密码

-d 后台运行 mysql/mysql-server:5.5 下载的镜像名字加标签

-v ./conf:/etc/mysql/conf.d:将主机当前目录下的 conf/my.cnf 挂载到容器的 /etc/mysql/my.cnf。//配置文件目录

-v ./logs:/logs:将主机当前目录下的 logs 目录挂载到容器的 /logs。//日志目录

-v ./data:/var/lib/mysql :将主机当前目录下的data目录挂载到容器的 /var/lib/mysql 。//数据库文件存放目录

上面这些参数都是可选的,可以不要。

4、查看某镜像的容器是否运行成功

docker ps |grep 镜像名

5、用docker exec进入容器内,然后用mysql -u root -p进入MySQL终端:

[li@aubin ~]$ docker exec -it  容器ID  /bin/bash
root@6657671f5bd8:/# mysql -u root -p

6、修改mysql允许远程连接:

mysql>GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
mysql>FLUSH PRIVILEGES;

在这里插入图片描述
然后我们可以通过本机连接容器内的数据库,(我们将容器内的3306端口映射到了本机的3308,所以我们通过3308端口访问)

mysql -u root -p -h 127.0.0.1 -P 3308

7、退出容器:

exit

或者

Ctrl+P+Q

8、重启容器

docker restart 容器ID

9、重启容器后进入交互式

docker start -i 5c6ce895b979

10、停止容器

docker stop mysqlserver

11、删除容器

docker rm mysqlserver

参考:使用Docker安装Mysql:https://www.cnblogs.com/loovelj/p/7823093.html
【Docker】退出容器和进入容器:https://www.cnblogs.com/defineconst/p/10035529.html

dockfile制作镜像命令:

请看我的另外一篇文章,写的很详细:
https://blog.csdn.net/u011208984/article/details/102756745

猜你喜欢

转载自blog.csdn.net/u011208984/article/details/100068275